Java는 객체지향 프로그래밍의 한 종류다. 객체 지향이란, 우리 주변에 볼 수 있는 물리적인 또는 추상적인 사물이나 개념의 특성 또는 행동을 파악하고, 이를 하나의 객체(Object)에 정의하는 프로그래밍의 한 방식이라고 필자는 정의한다.
태초에 가장 많이 사용했던 C 언어(지금도 임베디드 등에서 사용하기는 하지만)의 경우, 절차적 프로그래밍이라고 해서 마치 요리 레시피와 같이 위에서 순차적으로 코드를 실행하는 방식이었다. 하지만 절차적 프로그래밍의 경우, 실행하고자 하는 작업에 대해서는 명확히 구현할 수 있었지만, 특정 개체가 특정 행위를 하도록 만들기에는 어려움이 있었다. 가장 단적인 예로, 사람의 경우 이름과 나이, 성별이라는 특성을 가지고 "나이를 먹어간다"는 자연적인 행위를 하는 존재지만, 절차적 프로그래밍에서 이를 하나로 구현하기에는 어려움이 많다. 지금까지의 Java 포스팅 내용을 바탕으로 이를 구현하면 아래와 같다.
Java에서는 배열이 동일한 데이터타입만 담을 수 있도록 정의되어 있는데, 만약 서로 다른 데이터 타입을 담을 수 있는 구조가 있다면, 그리고 행위에 대해 정의를 한 코드 역시 함께 담을 수 있다면, 세상의 모든 물체를 조금 더 쉽게 구현할 수 있을 것이다. 이러한 이유로 나타난 것이 Java의 클래스다. 아직 클래스에 대해 배우지 않았지만, 클래스로 사람을 구현하고 Alex와 Bretta라는 객체를 만들고자 한다면 아래와 같이 코드를 작성할 수 있다.
사실 C 언어에서는 '구조체'라는 이름의, 서로 다른 데이터 타입을 담을 수 있는 구조가 존재하기는 하지만, 단순히 데이터를 묶기만 할 뿐 그들이 어떤 객체의 특성을 가지는지 나타낼 수 있는 방법이 전무하다. 또한 객체의 행위도 추가할 수 없고 말이다. 하지만 위의 예시에서 Class는 특정 객체의 특성을 서로 다른 데이터 타입으로 묶어 관리하는 것도 가능하고, 심지어 해당 객체의 행위마저도 매서드로 정의할 수 있다.
정리하자면, 클래스는 특정 객체의 특성 및 행위를 정의하는 하나의 단위라고 보면 된다.
그리고 Java는 클래스 단위로 파일을 컴파일하고 실행한다. 따라서 Java를 객체지향 프로그래밍 언어로 구분하는 것이다.
클래스에 대한 간략한 소개가 우당탕탕 끝났다. 본격적으로 클래스에 대해 알아보자.
1. Class 선언
** 링크 연결된 포스팅에서 확장자 .java 파일을 작성하는 방법에 대해 다시 확인하고 아래의 내용을 읽으면 좋다. 해당 링크의 "4. java 파일의 작성 규칙" 을 참고하자.
확장자 .java 파일은 두 개 이상의 클래스를 정의할 수 있는 파일이다. 따라서 필자는 Main 함수가 동작하는 주 클래스와 단색 신호등에 대해 정의된 클래스인 SignalLight 클래스를 코드로 작성하려 한다.
특정 객체에 대한 클래스를 작성하는 방법은 아래와 같다.
class 클래스명
{
}
Java에서 클래스명은 반드시 맨 앞글자가 대문자로 시작해야하며, 여러 단어가 합쳐진경우, 각 단어의 가장 앞 문자가 대문자를 이루어야 한다. 만약 필자가 class 이름을 signal과 light를 합쳐 명명한다고 하면, class SignalLight로 명명해야한다.
2. 객체 정의 - 특성(멤버변수)과 행위(매서드)
먼저 신호등에 대해 정의해보자. 일반적인 신호등은 원형의 모양으로 빨강, 노랑, 초록색의 삼색을 가진다. 그리고 각 신호등의 색은 일정 시간동안 켜져있다가 꺼지는 것을 반복한다. 따라서 신호등의 특성과 행위를 아래와 같이 나타낼 수 있다.
[ 신호등의 특성 ]
- 크기
- 모양
- 색상
- 지속시간
- 신호 점등 여부
[ 신호등의 행위 ]
- 불이 켜짐
- 불이 꺼짐
하나의 객체는 위에서 보는 것처럼 하나 이상의 특성과 하나 이상의 행위로 이루어진다. 클래스 내에서 객체의 특성은 변수 형태로, 객체의 행위는 함수 형태로 나타낸다. 여기서 클래스 내의 변수를 멤버변수(Member Variables)라고 하며, 객체의 행위를 정의하는 함수를 매서드(Method)라고 한다. 위의 특성을 멤버변수와 매서드(함수)로 나타내면 아래와 같다.
위의 클래스 내용을 자세히 보면, 서로 다른 특성을 가지는 멤버 변수를 제외한 나머지는 전부 정의가 되어 있다. 즉, 신호등에 대한 객체를 생성하는 일종의 틀이 마련되어 있다고 보면 된다. 무언가를 생산하기 위한 틀이 마련되어 있다면?? 해당 틀을 이용하여 각각의 객체를 생성하면 된다.
3. 클래스에 정의된 객체의 개별 생성 - 인스턴스화
클래스로부터 개별 객체를 생성하는 방법은 지금까지 포스팅에서 필자가 자주 시연했던 내용이다. 아래의 내용을 먼저 보자.
마치 배열 및 String 변수, 즉 참조형 변수를 생성하는 것과 동일한 형태다. 정리하자면 클래스로부터 객체를 생성하는 것은 클래스명을 일종의 데이터 타입으로 새 변수를 생성하는 것과 같다. 이렇게 하나의 클래스에 정의된 내용으로 생성된 새로운 객체를 인스턴스(Instance)라고 하며, 새로운 객체 생성 과정을 인스턴스화(instantiate)라고 한다.
정의한_클래스명 객체(변수)명 = new 정의한_클래스명 ();
클래스명으로부터 생성된 객체명은 참조형 변수이므로 객체명을 화면에 출력하면, 각 객체의 값이 저장된 SignalLight 메모리의 주소가 출력된다.
그럼 red_light, yellow_light, green_light 객체명에는 Class 특성과 매서드가 저장된 메모리의 주소가 저장되었는데, 이 메모리에 존재하는 특성값과 매서드는 어떻게 호출해야할까? 배열의 경우 index를 사용했지만, 클래스는 index값이 존재하지 않기 때문에 특성과 메서드를 호출할 수 없다.
클래스 내에서 멤버변수와 매서드를 호출하는 방법은 아래와 같다.
* 멤버변수 호출: 객체명.멤버변수명
* 매서드 호출 : 객체명.매서드명()
위의 내용으로 다시 빨간 신호등의 반지름 크기를 호출해보자. 아래와 같이 코드를 작성할 수 있다.
위 과정을 조금 더 응용하면, 아직 정의되지 않은 각 신호등 객체의 색상과 점등 시간도 정의할 수 있다.
이번에는 클래스 내에 정의된 매서드를 호출해보자. 먼저 매서드 동작 확인을 위해 SIgnalLight 클래스에 각 신호등의 정보를 출력하는 매서드를 추가하고 이 매서드를 호출하여 각 신호등의 정보를 확인해보자.
객체명.매서드명()으로 SignalLight 내에 정의된 신호등 정보를 출력하는 매서드가 실행된 것이 보인다. 이제, 필자는 빨간색 및 노란색 신호등을 light_off() 매서드로 끈 뒤, 신호등 정보를 다시 출력해보려 한다.
빨간색 및 노란색 신호등의 불이 꺼진 것(false)이 확인된다. 위의 결과를 확인해보면 알겠지만, 클래스로부터 생성된 객체의 멤버변수와 매서드는 기본적으로 자기 자신이 아닌 다른 객체에는 영향을 미칠 수 없다(영향을 미칠 수 있도록 만드는 방법은 나중에...). 그렇기 때문에 클래스를 사용하면 각 객체가 가지는 독자적인 특성과 행위에 대한 코드 구현이 가능해지는 것이다.
다음 포스팅에서는 매서드 생성 방법 및 클래스, 객체 생성 시 메모리에서 일어나는 현상에 대해 설명해보려 한다.
Fin.
'Java > Java Basic' 카테고리의 다른 글
[Java Basic] 14. Java 매서드 오버로딩(Overloading)과 가변인자 (0) | 2022.07.06 |
---|---|
[Java Basic] 13. Java 매서드 작성, Java 클래스와 메모리 (0) | 2022.07.05 |
[Java Basic] 11. 입력값 받기 - System.in과 Scanner 클래스 (0) | 2022.07.03 |
[Java Basic] 10. 배열 4 - 다차원배열 (0) | 2022.07.02 |
[Java Basic] 9. 배열 3 - 문자열 배열과 String 타입 (0) | 2022.07.01 |
댓글