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 입니다.



인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 함
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 (저자 : 남궁성, 출판 : 도우출판)
'공부 > Java' 카테고리의 다른 글
[Java-06] 객체지향프로그래밍 - 오버로딩, 생성자 (0) | 2021.02.18 |
---|---|
[Java-06] 객체지향프로그래밍 - 변수, 메서드 (0) | 2021.02.17 |
[Java-05] 배열(Array) - String 배열, 2차원 배열 (0) | 2021.02.15 |
[Java-05] 배열(Array) - 1차원 배열 (0) | 2021.02.10 |
[Java-04] 조건문과 반복문 (0) | 2021.02.09 |