공부/Java

[Java-06] 객체지향프로그래밍 - 클래스, 객체

줭♪(´▽`) 2021. 2. 16. 11:59

1. 객체지향언어

 

"실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이다."

 

- 실제 사물의 속성과 기능을 분석한 다음, 데이터(변수)와 함수(메서드)로 정의함으로써 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상세계를 구현함

- 기존의 'FORTRAN', 'COBOL'과 같은 절차적 언어의 한계를 느끼고 객체지향언어를 이용한 개발방법론이 대안으로 떠오르게 되면서 객체지향언어는 프로그래밍언어의 주류로 자리 잡음

- 1960년대 중반 최초의 객체지향언어 '시뮬라(Simula)'를 시작으로 'C++', '자바(Java)'가 발표됨

 

 

객체지향언어의 특징

1. 코드의 재사용성이 높음
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있음
2. 코드의 관리가 용이
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있음
3. 신뢰성이 높은 프로그래밍을 가능하게 함
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 함
- 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있음

Keyword : 재사용성, 유지보수, 중복된 코드 제거

 

2. 클래스와 객체

1) 클래스와 객체의 정의

 

클래스 : 객체를 정의해놓은 것
객체 : 실제로 존재하는 것, 사물 또는 개념
  - 유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
  - 무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념

-> 클래스를 정의하고 클래스를 통해 객체를 생성함

 

클래스 객체
제품 설계도 제품
TV 설계도 TV
붕어빵 기계 붕어빵

 

2) 객체와 인스턴스

- 인스턴스화(instantiate) : 클래스로부터 객체를 만드는 과정

- 인스턴스(instance) : 어떤 클래스로부터 만들어진 객체

- 인스턴스와 객체는 같은 의미지만, 문맥에 따라 구별하여 사용하는 것이 좋음

 

 

3) 객체의 구성요소

- 객체는 속성기능의 집합

- 객체가 가지고 있는 속성과 기능을 그 객체의 멤버(구성원, member)라고 함

- 클래스에는 객체의 모든 속성과 기능이 정의됨

 

- 속성(property) = 멤버변수(member variable) = 특성(attribute) = 필드(field) = 상태(state)

- 기능(function) = 메서드(method) = 함수(function) = 행위(behavior)

 

 

4) 인스턴스의 생성과 사용

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

Tv t;
t = new TV();

 

class Tv {
	// Tv의 속성(멤버변수)
    String color;
    boolean power;
    int channel;
    
    // Tv의 기능(메서드)
    void power() { power = !power; }
    void channelUp() { ++channel; }
    void channelDown() { --channel; }
}

class TvTest {
	public static void main(String args[]) {
    	Tv t;				// Tv인스턴스를 참조하기 위한 변수 t 선언
        t = new Tv();			// Tv인스턴스 생성
        t.channel = 7;			// Tv인스턴스 멤버변수 channel의 값을 7로 함
        t.channelDown();		// Tv인스턴스의 메서드 channelDown() 호출
        System.out.println("현재 채널은 " + t.channel + " 입니다.");
}

-> 결과 : 현재 채널은 7 입니다.

 

 

생성된 객체의 주소값이 참조변수 t에 저장됨
channel = 7;

 

channelDown()을 호출함으로써 channel이 1 감소됨

 

 

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

 

 

5) 객체 배열

- 객체를 배열로 다룰 수 있음

- 단, 객체가 저장되는 것이 아닌 객체의 주소가 저장

- 참조변수들을 하나로 묶은 참조변수 배열

 

Tv tv1, tv2, tv3;

// 객체 배열로 생성 가능
Tv[] tvArr = new Tv[3];

 

 

- 객체 배열을 생성한 후 객체를 생성해서 객체 배열의 각 요소에 객체를 저장해야 함

 

// 1. 기본 방법
Tv[] tvArr = new Tv[3];

tvArr[0] = new Tv();
tvArr[1] = new Tv();
tvArr[2] = new Tv();


// 2. 배열의 초기화 블럭을 사용하는 방법
Tv[] tvArr = { new Tv(), new Tv(), new Tv() };


// 3. for문을 이용한 방법
Tv[] tvArr = new Tv[3];
for(int i = 0; i < tvArr.length; i++)
	tvArr[i] = new Tv();

 

 

6) 클래스의 또 다른 정의

- 앞서 살펴본 클래스는 객체지향이론 관점의 클래스고, 프로그래밍 관점에서 클래스의 정의는 조금 다름

 

① 클래스 = 데이터와 함수의 결합

 

변수 : 하나의 데이터를 저장할 수 있는 공간
배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
클래스 : 데이터와 함수의 결합(구조체 + 함수)

 

 

② 클래스 = 사용자정의 타입(user-defined type)

- 사용자정의 타입 : 프로그래밍언어에서 제공하는 자료형 외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것

- 객체지향언어에서는 클래스가 곧 사용자 정의 타입임

 

 

 

 

 

참고 - Java의 정석 3rd Edition (저자 : 남궁성, 출판 : 도우출판)