객체지향언어의 역사
o 객체지향이론의 기본 개념은 ‘실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다.라는 것이다.
o 1960년대 중반 시뮬라(Simula)라는 객체지향이론을 프로그래밍언어에 적용한 최초의 언어가 탄생했다.
o 초반에는 절차지향 언어들에 의해 각광을 받지 못했으나 시간이 지나면서 프로그램의 규모가 커질수록 절차지향언어로는 한계점을 느껴 객체지향언어가 대안으로 떠오르면서 각광을 받기 시작했다.
o 1995년에 자바가 발표되고 1990년대 말에 인터넷의 발전과 함께 크게 유행하면서 객체지향언어가 프로그래밍 언어의 주류로 자리잡았다.
객체지향언어
o 객체지향언어의 특징은 다음과 같다.
1. 코드의 재사용성이 높다 – 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다. – 코드 간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다. – 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
o 객체지향개념을 학습할 때 재사용성, 유지보수, 중복된 코드 제거 이 세가지 관점으로 보면 쉽게 이해할 수 있다.
o 객체지향개념에 얽매여서 고민하기보다 프로그램을 기능적으로 완성시킨 후 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지 고민한 다음 개선해 나가는 것이 좋다.
클래스와 객체의 정의와 용도
o 클래스의 정의 : 객체를 정의해 놓은 것 또는 객체를 만들기 위한 설계도이다.
클래스의 용도 : 객체를 생성하는데 사용되며, 객체는 클래스의 정의된 대로 생성된다.
o 객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념
o 제품을 만들 때 설계도를 먼저 만들고 설계도를 통해 제품을 만드는 것처럼 프로그래밍 언어는 클래스는 먼저 작성한 다음, 클래스로부터 객체를 생성한다.
객체와 인스턴스 (※ 차이점 알아 두기)
o 객체 : 소프트웨어 세계에서 구현할 대상으로 oop관점에서 클래스의 타입으로 선언되었을 때 객체라고 한다.
: 모든 인스턴스를 대표하는 포괄적인 의미를 갖는다.
o 인스턴스(instance) : 어떤 클래스로부터 만들어진 객체를 인스턴스라고 하며 어떤 클래스로부터 만들어진 것인지 보다 구체적인 의미를 갖고 있다. 객체 선언 후 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 하며 객체가 실제로 구현된 것을 말한다.
o 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정을 ‘인스턴스화’한다고 한다.
o 객체와 인스턴스 어떻게 보면 같은 의미지만 문맥에 따라 구별하는 것이 좋다.
객체의 구성요소 – 속성과 기능
o 객체는 속성과 기능으로 이루어진 집합으로 일반적으로 다수의 속성과 기능을 갖는다. 객체가 가지고 있는 속성과 기능을 객체의 멤버(member)라고 한다.
o 클래스는 객체를 정의한 것이므로 클래스에 속성과 기능이 모두 정의되어 있으며 객체를 생성하면 클래스에 정의된 속성과 기능을 가진 객체가 생성되는 것이다.
o 속성(property) : 멤버 변수(member variable), 특성(attribute), 필드(field), 상태(state)
o 기능(function) : 메서드(method), 함수(function), 행위(behavior)
인스턴스 생성과 사용
o 클래스로부터 인스턴스를 생성하기 위해서 일반적으로 다음과 같은 방법을 사용한다.
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장.
o 예제
class Tv {
// TV의 속성(멤버 변수)
String color;
boolean power;
int channel;
// TV의 기능(메서드)
void power() {power = !power;} // TV를 켜거나 끄는 메소드
void channelUp() { ++channel;} // TV의 채널을 올리는 메소드
void channelDown() { --channel;} // TV의 채널을 내리는 메소드
}
class TvTest {
public static void main(String args[]) {
Tv t; // Tv인스턴스를 생성하기 위한 참조변수 선언
t = new Tv(); // Tv인스턴스를 생성
t.channel = 7; // Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.
t.channelDown(); // Tv인스턴스의 메소드 channelDown()을 호출한다.
System.out.println("현재 채널은 " + t.channel + " 입니다.");
}
}
|
1. Tv t;
Tv클래스 타입의 참조변수 t를 생성한다. 메모리에 참조변수 t를 위한 공간이 마련되나 인스턴스를 생성하지 않았으므로 참조변수로 아무 것도 할 수 없다.
2. t = new Tv();
연자자 new에 의해 Tv클래스의 인스턴스가 메모리 빈 공간에 생성된다. 멤버 변수는 각 자료형의 기본값으로 초기화 된다. 그 다음 대입연산자(=)에 의해 생성된 객체의 주소 값이 참조 변수 t에 저장된다. 이제야 참조 변수 t를 통해 Tv인스턴스에 접근할 수 있다. 인스턴스를 다루기 위해서는 반드시 참조변수가 필요하다.
3. t.channel = 7;
참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장한다. 인스턴스의 멤버변수(속성)을 사용하려면 ‘참조변수.멤버변수’로 하면 된다.
4. t.channelDown();
참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown()메서드를 호출한다. channelDown() 메서드 내용인 멤버변수 channel의 값을 1감소시킨다.
o 인스턴스는 참조변수를 통해서만 다룰 수 있으며 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
o 객체가 2개일 경우의 동작은 다음과 같다.
class Tv {
// TV의 속성(멤버 변수)
String color;
boolean power;
int channel;
// TV의 기능(메서드)
void power() {power = !power;} // TV를 켜거나 끄는 메소드
void channelUp() { ++channel;} // TV의 채널을 올리는 메소드
void channelDown() { --channel;} // TV의 채널을 내리는 메소드
}
class TvTest {
public static void main(String args[]) {
Tv t1 = new Tv(); // 한 문장으로도 가능
Tv t2 = new Tv();
t1.channel = 7; // Tv인스턴스의 멤버 변수 channel의 값을 7로 한다.
System.out.println("t1의 채널은 " + t1.channel + " 입니다.");
System.out.println("t2의 채널은 " + t2.channel + " 입니다.");
t2=t1; //t1이 저장하고 있는 주소 값을 t2에 저장
t1.channel=10; //t1의 channel 값을 10으로 변경
System.out.println("t1의 채널은 " + t1.channel + " 입니다.");
System.out.println("t2의 채널은 " + t2.channel + " 입니다.");
}
}
|
1. Tv t1 = new Tv();
Tv t2 = new Tv();
2. t1.channel = 7;
같은 클래스로부터 생성되었더라도 각 인스턴스의 속성(메개 변수)는 서로 별도로 저장할 수 있으며 메서드 내용은 동일하다. 즉 각각의 인스턴스는 별개로 동작을 한다.
3. t2=t1;
t1은 잠조변수 이므로, 인스턴스의 주소 값을 저장하고 있다. 이 문장을 실행 시 t1이 가지고 있는 주소 값이 t2에 저장되게 된다. 결국 t1,t2가 같은 인스턴스를 참조하게 되어 기존의 참조변수 t2가 참조했던 인스턴스는 사용할 수 없게 된다.
참조하고 있는 참조변수가 하나도 없는 인스턴스는 사용할 수 없으므로 Garbage Collector에 의해서 자동으로 메모리에서 제거된다.
4. t1.channel=10;
t1과 t2가 같은 Tv클래스의 인스턴스를 가리키고 있기 때문에 t1객체에서 매개변수 값을 변경 시 t2에서도 똑같이 영향을 받는다.
o 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조) 것은 가능하지만 참조변수는 하나의 값(주소)이 저장될 수 있으므로 하나의 참조변수에서 여러 개의 인스턴스를 가리키는 것은 불가능하다.
객체 배열
o 많은 수의 객체를 다뤄야 할 때 배열로 다루는 것이 가능하며 이를 ‘객체 배열’이라고 한다. 객체 배열은 참조 변수들을 하나로 묶은 것이다. 그렇기에 객체 배열안에 객체가 저장되는 것이 아닌, 객체의 주소가 저장된다. 객체 배열의 생성은 참조 변수만 만들어 지는 것뿐 객체가 저장된 것은 아니며 객체를 생성해서 객체 배열의 각 요소에 저장을 해줘야 한다.
o 참조 배열의 생성만 했을 경우 객체가 저장된 것은 아니다.
Tv[] tvArr = new Tv[3]; // 참조 변수 배열 생성
tvArr[0] = new Tv(); // 객체 생성 후 배열의 각 요소에 저장
tvArr[1] = new Tv();
tvArr[2] = new Tv();
Tv[] tvArr2 = {new Tv(),new Tv(),new Tv(),}; // 한줄로 생성도 가능
|
o 배열이 그렇듯 객체 배열도 같은 타입의 객체만 저장할 수 있다. 여러 종류의 객체를 저장하기 위해서는 추후 다형성에 대해 알면 알 수 있다.
클래스의 또 다른 정의
1. 클래스 – 데이터와 함수의 결합
변수 : 하나의 데이터를 저장할 수 있는 공간
배열 : 같은 종류의 여러 데이터(변수)를 하나의 집합으로 저장할 수 있는 공간
구조체 : 서로 관련된 여러 데이터(데이터)를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
클래스 : 데이터와 함수의 결합(구조체 + 함수)
2. 클래스 – 사용자정의 타입(user-defined type)
프로그래밍언어에서 제공하는 자료형 외에 프로그래머가 서로 관련된 변수들을 묶어 하나의 타입으로 새로 정의한 것을 사용자정의 타입이라고 한다.
'언어 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] Chapter 6 객체 지향 프로그래밍 요약(3) (0) | 2021.02.03 |
---|---|
[자바의 정석] Chapter 6 객체 지향 프로그래밍 요약(2) (0) | 2021.02.03 |
[자바의 정석] Chapter 5 배열(Array) 요약 (0) | 2021.01.27 |
[자바의 정석] Chapter 3 연산자(Operator) (0) | 2021.01.21 |
[자바의 정석] Chapter 2 변수 (0) | 2021.01.19 |