본문 바로가기

언어공부/Java

자바 클래스와 객체 - 객체지향 언어/ 객체 속성과 기능/ 객체와 인스턴스/ 객체의 생성과 사용

자바 클래스와 객체에 대해서 알아보자.

그 전에, 객체지향 언어가 무엇인가에 대해서 다시 정의해 보자.

객체지향 언어

객체지향언어는 기존의 프로그래밍 언어와 다른 새로운 것이 아니라, 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 발전된 형태의 것이다.

 

c언어가 절차지향 언어라고 하면, java, c++등은 객체지향 언어이다.

객체지향언어와 절차지향언어의 차이점은 클래스와 객체의 유무이다. 절차지향은 코드를 단순히 순차적으로만 실행하는 반면, 객체지향은 객체 생성을 위해 객체의 설계도(클래스)를 만드는 방식으로 순서가 정해진 객체를 먼저 처리하는 방식이다.

 

예를들어, 2+3*4를 절차지향 언어와 객체지향 언어가 계산을 했을 때, 절차지향은 순차적으로 계산해 (2+3)*4로 24가 계산되며, 절차지향은 우선순위로 계산해 2+(3*4)로 14가 계산된다.

 

또한 객체지향언어의 특징으로는 코드의 재사용성이 높고 관리가 용이하며 중복된 코드의 제거 및 유지보수하기가 쉽다.

 


클래스와 객체

클래스는 객체를 정의해 놓은 것이며, 객체의 설계도 또는 틀이라고 정의할 수 있다. 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성된다.

 

프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻한다. 클래스와 객체를 예를들면, 제품설계도와 제품, 붕어빵 기계와 붕어빵이라고 할 수 있다. 클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아니다. 우리가 원하는 기능의 객체를 사용하기 위해서는 먼저 클래스로부터 객체를 생성하는 과정이 선행되어야 한다.

 


객체 속성과 기능

객체를 사용한다는 것은 객체가 가지고 있는 속성과 기능을 사용한다는 뜻이다. 일반적으로 객체는 다수의 속성과 기능을 갖으며, 객체는 속성과 기능의 집합이라고 할 수 있다. 이러한 속성과 기능을 그 객체의 멤버라 한다.

 

여기서 속성(property)은 멤버변수(variable), 기능(function)은 메소드(Method)로 표현한다.

 


객체와 인스턴스

클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다. 예를 들어 Thing클래스로 부터 만들어진 객체를 Thing클래스의 인스턴스라고 한다. 결국 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미이며, 인스턴스는 어떤 클래스로부터 만들어진 것인지 보다 강조하는 의미이다.

 


객체의 생성과 사용

예를 들어 TV클래스를 선언하면, 클래스 안에 TV인스턴스를 생성해야 제품(TV)을 사용할 수 있다. 

ex) 클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언

     변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장.

 

위의 예제에서 선언, 생성 및 초기화를 한꺼번에 하려면 아래와 같이 작성해주면 된다.

ex) 클래스명 변수명 = new 클래스명(); // 객체주소를 참조변수에 저장. 변수명은 객체명이 된다.

 

 

연산자 new에 의해 TV11클래스의 인스턴스가 메모리의 빈 공간에 생성된다. 이 때 멤버변수는 각 자료형에 해당하는 기본값으로 초기화 된다(color는 null, power는 false, channel은 0). 그 다음 대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장된다. 이후 참조변수 t를 통해 TV11인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 참조변수가 반드시 필요하다.

 

인스턴스의 멤버변수(속성)을 사용하려면 "참조변수.멤버변수"와 같이 사용하면 된다. 

ex) t.channel=7;

 

인스턴스의 메소드(기능)을 사용하려면 "참조변수.메소드()"와 같이 사용하면 된다.

ex) t.channelDown();

 

인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다. TV11인스턴스를 사용하려면, TV11클래스 타입의 참조변수가 필요하다.

 

추가로, 똑같은 TV12클래스에서 참조변수 t01과 t02를 생성 및 초기화했을 때, 이 둘은 각각 다른 객체 주소를 가지게 된다.