객체지향 언어와 Java의 객체, 클래스, 인스턴스
https://www.educative.io/blog/object-oriented-programming
자바는 객체지향 프로그래밍 언어(Object-Oriented Programming Language)이다. 객체지향 언어는 현실 세계의 시스템을 객체의 관점에서 프로그래밍하는 것이다. 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태의 프로그래밍 언어로 이러한 규칙들을 이용해서 코드 간에 서로 관계를 맺어 보다 유기적으로 프로그램을 구성하는 것이 가능해졌다. 객체지향 언어의 가장 큰 장점은 코드의 재사용성이 높고 유지보수가 용이하다는 점이다.
그렇다면 객체(Object)란 과연 무엇일까? Object의 사전적 의미는 보고 만질 수 있는 사물을 의미한다. 객체지향 프로그래밍 언어에서는 우리가 살고 있는 현실 세계에 존재하는 모든 것을 프로그램 상에서 객체(Object)로 표현하기로 한 것이다. 현실 세계의 객체들은 두 가지의 공통된 특성인 속성과 기능을 갖는다. 이런 연관된 속성과 기능을 소프트웨어적으로 묶은 것이 바로 객체지향 프로그래밍에서의 객체이며 속성과 기능을 각각 변수와 메서드로 표현한다. 그리고 변수와 메서드는 그 객체의 구성원(멤버)이 된다.
클래스는 객체의 설계도 또는 프로토타입이라고 할 수 있다. 클래스를 사용하여 객체를 생성하며 객체는 클래스에 정의된 대로 생성된다. TV를 제작하기 위해서는 TV 설계도가 필요한 것처럼 클래스와 객체는 제품 설계도와 제품과의 관계라고 할 수 있다. 이렇게 클래스를 정의하고 클래스를 통해 객체를 생성하는 이유는 설계도를 통해서 제품을 만드는 이유와 같다. 하나의 설계도만 잘 만들어 놓으면 제품을 만드는 일이 쉬워지기 때문이다.
다음은 현실 세계의 객체를 클래스로 만들어 보는 과정이다.
클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다. 인스턴스와 객체는 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 보다 강조하는 의미를 갖고 있다.
클래스 → 인스턴스화 → 인스턴스(객체)
예를 들면, ‘TV는 인스턴스다.’라고 하기 보다는 ‘TV는 객체다.’라는 쪽이, ‘TV는 TV 클래스의 객체이다.’라고 하기 보다는 ‘TV는 TV 클래스의 인스턴스다.’라고 하는 것이 더 자연스럽다.
TV 클래스를 선언한 것은 TV 설계도를 작성한 것에 불과하므로, TV 인스턴스를 생성해야 제품을 사용할 수 있다. 일반적으로 클래스로부터 인스턴스를 생성하고 사용하는 방법은 다음과 같다.
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
변수명.멤버변수 ... ; // 객체의 속성(멤버변수)를 사용
Tv t;
t = new Tv();
t.channel = 7;
위에서 언급했듯이 객체는 변수와 메서드를 가진다. 변수는 어디에 선언되었는지에 따라 3종류로 나뉘는데 다음과 같다.
... { // 클래스 영역
int iv; // 인스턴스 변수
static int cv; // 클래스 변수 / static 변수 / 공유 변수
void method() { // 메서드 영역
int lv = 0; // 지역변수
}
}
종류 | 선언 위치 | 생성 시기 |
---|---|---|
인스턴스 변수(instance variable) | 클래스 영역 | 인스턴스가 생성되었을 때 |
클래스 변수(class variable) | 클래스 영역 | 클래스가 메모리에 올라갈 때 |
지역 변수(lacal variable) | 클래스 영역 이외의 영역 | |
(메서드, 생성자, 초기화 블럭 내부) | 변수 선언문이 수행되었을 때 |
static
을 붙이면 클래스 변수가 됨클래스 이름. 클래스 변수
와 같이 사용할 수 있음