자바프로그램에서 가장 중요한 개념인 클래스에 대해 알아보도록 하겠습니다. 현실 세계에서 어떤 제품을 만들 때 부품을 먼저 개발하고 이 부품들을 하나씩 조립해서 제품을 완성하듯이 소프트웨어를 개발할 때에도 부품에 해당하는 객체를 먼저 만듭니다. 그리고 객체를 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체지향 프로그래밍(Object-Oriented Programming)이라고 합니다.
객체(Object)란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것을 말합니다. 예를 들어 물리적으로 존재하는 자동차, 자전거, 책, 사람과 추상적인 학과, 강의, 주문 등이 모두 객체가 될 수 있습니다. 객체는 속성과 동작으로 구성되어있습니다. 예를 들어 사람은 이름, 나이 등의 속성과 웃다, 것다 등의 동작이 있고, 자동차는 색, 모델명 등의 속성과 달린다, 멈춘다 등의 동작이있습니다. 자바는 이 속성과 동작을 각각 필드(field)와 메소드(method)라고 부릅니다.
위의 설명이 어렵고 헷갈릴 수 있습니다. 그럼 다음과 같이 간단히 정리해보도록 하겠습니다. 객체는 명사라고 생각할 수 있습니다. 이름이 있는 모든 것이 객체가 될 수 있습니다. 필드는 그 객체의 속성을 나타내는 명사이고 메소드는 그 객체의 행동을 나타내는 동사라고 생각할 수 있습니다.
객체의 상호작용
객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용을 하면서 동작합니다. 객체들 사이의 상호작용 수단은 메소드입니다. 이때 객체가 다른 객체의 기능을 이용하는 것이 바로 메소드 호출입니다. 메소드 호출은 다음과 같은 형태를 가지고 있습니다.
리턴값 = 객체.메소드(매개값1, 매개값2, ...);
객체에 도트(.) 연산자를 붙이고 메소드 이름을 기술하면 됩니다. 도트 연산자는 객체의 필드와 메소드에 접근할 때 사용합니다. 매개값은 메소드를 실행하기 위해 필요한 데이터입니다.
객체 간의 관계
객체는 개별적으로 사용될 수 있지만, 대부분 다른 객체와 관계를 맺고 있습니다. 대부분 다른 객체와 관계를 맺고 있습니다. 이 관계의 종류에는 집합관계, 사용관계, 상속관계가 있습니다.
1. 집합 관계 : 객체는 하나는 부품이고 하나는 완성품에 해당합니다.
2. 사용 관계 : 객체 간의 상호작용을 말합니다.
3. 상속 관계 : 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계를 말합니다.
객체 지향 프로그래밍은 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법입니다. 이 관계에 대해서는 나중에 살펴보겠습니다.
객체와 클래스
객체 지향 프로그래밍에서는 사용하고자 하는 객체가 있다면 우선 설계도를 만들어야하는데 이게 클래스입니다. 자바에서는 설계도가 바로 클래스입니다. 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어있습니다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 합니다. 그리고 클래스로부터 객체를 만드는 과정을 인스턴스화라고 합니다. 하나의 클래스로부터 여러 개의 인스턴스를 만들 수 있는데, 이것은 동일한 설계로부터 여러 대의 자동차를 만드는 것과 동일합니다.
객체 지향 프로그래밍 개발은 세가지 단계가 있습니다.
1. 클래스를 설계합니다.
2. 설계된 클래스를 가지고 사용할 객체를 생성합니다.
3. 생성된 객체를 이용합니다.
클래스 선언
이제부터 클래스를 선언하는 방법에 대해 알아보겠습니다. 사용하고자 하는 객체를 구상했다면 그 객체의 대표이름을 하나 결정하고 이것을 클래스 이름으로 정합니다. 클래스 이름은 다른 클래스와 식별할 목적으로 사용되므로 자바의 식별자 작성 규칙에 따라서 만들어야 합니다. 클래스 이름은 통상적으로 대문자로 시작합니다. 클래스 이름을 정했다면 "클래스이름.java"로 소스 화일을 생성해야 합니다. 소스화일 이름 역시 대소문자를 구분하므로 반드시 클래스 이름과 대소문자가 같도록 해야합니다.
객체 생성과 클래스 변수
클래스로부터 객체를 생성하려면 다음과 같이 new 연산자를 사용하면 됩니다.
new 클래스();
new는 클래스로부터 객체를 생성시키는 연산자입니다. new 연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있습니다. new 연산자로 생성된 객체는 메모리 힙 영역에 생성시킨 후 객체의 번지를 리턴하도록 되어있습니다. 이 주소를 참조타입인 클래스변수에 저장해두면 변수를 통해 객체를 사용할 수 있습니다.
클래스의 구성 멤버
클래스에는 객체가 가져야 할 구성 멤버가 선언됩니다. 구성 멤버에는 필드(field), 생성자(constructor), 메소드(method)가 있습니다. 이 구성 멤버들은 생략되거나 복수의 개수로 작성될 수 있습니다.
필드
필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳입니다. 선언 형태는 변수와 비슷하지만, 필드를 변수라고 부르지는 않습니다.
생성자
생성자는 new 연산자로 호출되는 특별한 중괄호 {} 블록입니다. 생성자의 역할은 객체 생성 시 초기화를 담당합니다. 생성자는 메소드와 비슷하게 생겼지만, 클래스 이름으로 되어있고 리턴타입이 없습니다.
메소드
메소드는 객체의 동작에 해당하는 중괄호 {} 블록을 말합니다. 중괄호 블록은 이름을 가지는데 이것이 메소드 이름입니다. 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행됩니다.
자바의 클래스에 대한 정의를 살펴봤지만 설명만으로는 이해가 힘듭니다. 하지만 실제 프로그램을 보면 좀 더 이해하기가 쉽습니다. 자바 클래스에 대해 간단히 정리해보도록 하겠습니다.
클래스: 객체를 만들기 위한 설계도입니다. 대문자로 시작합니다.
객체: 클래스로부터 생성되며 new 클래스(); 로 생성됩니다.
new 연산자: 객체 생성 연산자이며, 생성자를 호출하고 객체 생성 번지를 리턴합니다.
클래스 변수: 클래스로 선언한 변수를 말하며 해당 클래스의 객체 번지가 저장됩니다.
인스턴스: 객체는 클래스의 인스턴스입니다.
클래스 멤버: 클래스에 선언되는 멤버는 필드, 생성자, 메소드가 있습니다.
'프로그래밍 > Java 프로그래밍' 카테고리의 다른 글
자바의 메소드 (0) | 2020.07.09 |
---|---|
자바의 필드와 생성자 (0) | 2020.07.07 |
자바의 열거타입 (0) | 2020.07.05 |
자바의 배열과 향상된 for문 (0) | 2020.07.04 |
자바의 배열 (0) | 2020.07.03 |