[자바의 정석] 06 객체 지향 프로그래밍 (1)

2022. 4. 15. 16:16Java

1. 객체지향언어

 

1.1 객체지향언어의 역사

 

- 객체지향이론의 기본 개념 : 실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다.

-> 상속, 캡슐화, 추상화 개념을 중심으로 구체적으로 발전.

 

1.2 객체지향언어

 

- 특징 

1. 코드의 재사용성이 높다 : 기존의 코드를 이용해 쉽게 작성할 수 있다.

2. 코드의 관리가 용이하다 : 코드의 관계를 이용해 적은 노력으로 쉽게 코드를 변경할 수 있다.

3. 신뢰성이 높은 프로그래밍을 가능하게 한다 : 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다. 

 

=> 프로그램 개발과 유지보수에 드는 시간과 비용을 획기적으로 개선할 수 있는 장점.

( 객체 지향에 얽매이는 것보다 기능적으로 완성하고 코드를 객체지향적으로 개선할 수 있는지 개선해 나가는 것이 좋음. )


2. 클래스와 객체 

 

2.1 클래스와 객체의 정의와 용도

 

정의 : 객체를 정의해 놓은 것 (객체 그 자체는 아님.)

용도 : 객체를 생성하는 데에 사용

(객체란 ? 실제로 존재하는 것. 사물 또는 개념. 프로그래밍에서 객체는 클래스에 정의된 내용대로 메모리에 생성.)클래스와 객체의 관계는 일종의 설계도와 실제품 같음.

 

2.2 객체와 인스턴스

 

클래스 - 인스턴스화 -> 인스턴스(객체)

 

- 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정 - 인스턴스(instance) : 어떠한 클래스로부터 만들어진 객체ex) TV 클래스로부터 만들어진 객체 : TV 클래스의 인스턴스

 

객체는 모든 인스턴스를 대표하는 포괄적인 의미. 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미.

 

2.3 객체의 구성 요소 - 속성과 기능

 

객체는 속성과 기능을 갖고 있음. 이를 그 객체의 구성 멤버(구성원, member) 이라 함.클래스로부터 객체를 생성하면 클래스에서 정의된 모든 속성과 기능이 객체에도 생성 됨.

 

속성 (property) :  멤버 변수(member invariable), 필드(field), 특성(attribute), 상태(state)기능 (function) :  메서드(method), 함수(function), 행위(behavior)

 

ex) TV 클래스속성 : 크기, 높이, 길이, 색깔 등기능 : 켜기, 끄기, 볼륨 높/낮추기 등

 

2.4 인스턴스의 생성과 사용 

 

클래스는 설계도에 불과하기에 실제로 사용하기 위해서는 인스턴스를 생성해야 한다.앞서 예시로 든 TV 클래스로 예를 들자면 다음과 같다.

class TV {
	String color;
    boolean power;
    int channel;
    
    void power();
    void channelUp();
    void channelDown();
}


Tv t; // 클래스명 변수명; 
// 클래스의 객체를 참조하기 위한 참조 변수를 선언
t = new TV(); // 변수명 = new 클래스명(); 
//클래스의 객체를 생성 후, 객체 주소를 참조 변수에 저장

이 과정을 조금 더 상세히 써보도록 하자.

 

TV t; 

: TV 클래스 타입의 참조 변수 t를 선언했다면 메모리에 참조변수 t를 위한 공간이 마련된다.

 

t = new TV();

: 연산자 new에 의해 TV 클래스의 인스턴스가 메모리 빈 공간에 생성된다.

멤버 변수는 각 자료형에 해당하는 기본값으로 초기화 된다.

 

그 후 대입연산자(=)에 의해 생성된 객체의 주소값이 참조 변수 t에 저장이 된다.

이제는 참조변수 t를 통해 tv 인스턴스에 접근할 수 있다.

 

t.channel ; t.shutdown();

: 인스턴스에 멤버변수(속성)를 사용하려면 '참조변수.멤버변수'와 같이 하면 된다.

 

=> 인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 한다.

 더불어 t는 객체의 주소값이 저장되기 때문에 만약 같은 인스턴스 타입의 다른 참조변수

Tv t1 = new Tv();

Tv t2 = new Tv();

 

t1 = t2;

이렇게 되는 경우라면 t2가 t1의 값을 저장하기에 원래 참조하고 있던 인스턴스는 더이상 참조할 수 없다.

 

2.5 객체 배열

 

많은 수의 객체를 다뤄야할 때 배열로 다루면 편리하게 다룰 수 있다. 각 배열에는 객체가 저장되는 것이 아니라 객체의 주소가 저장된다. 객체 배열은 참조변수를 하나로 묶은 참조 변수의 배열이 된다.

(그렇기에 객체 배열을 선언했더라면 각 배열에 객체를 생성하야 하는 것을 잊지 말아야 한다.)

 

가령

Tv tvArr[] = new TV[3];

for(int i=0; i<tvArr.length; i++) {
	tvArr[i] = new TV();
}

이렇게 TV 클래스를 객체 배열로 생성하였다면 이는 단순히 주소 공간이 저장된 것일 뿐 실제로 각각의 객체가 생성된 것이 아니기 때문에 for문을 돌면서 하나하나 객체를 생성해야 한다.

 

2.6 클래스의 또 다른 정의

 

프로그래밍의 관점에서 클래스의 정의와 의미를 살펴본다면 다음과 같다.

 

1. 클래스 - 데이터와 함수의 결합

하나의 데이터를 저장하기 위해 변수를 -> 효율적으로 저장하기 위해 배열을 -> 서로 관계가 깊은 것끼리 묶을 수 이는 구조체 -> 클래스(데이터와 함수의 결합 : 구조체 + 함수)의 등장

 

2. 클래스 - 사용자정의 타입(user-defined type)프로그래밍 언어에서 제공하는 자료형 외에 프로그래머가 서로 관련된 변수를 묶어서 하나의 타입으로 새로 추가 하는 것을 사용자 정의 타입(user-defined type)이라 한다.

 

만약 저장해야 하는 객체가 많다면 배열로 저장하기에는 배열의 선언된 공간을 넘어서면 문제가 되기에클래스로 변경을 해주면 변수를 매번 새로 선언해줘야 하는 불편함과 복잡함이 없어진다.

// 하나씩 선언된 변수
int hour;
int minute;
float second;

// 클래스 안에 정의
class Time {
    int hour;
    int minute;
    float second;
}