OOP02
객체지향 개념
객체란?
- 객체 == object == 물건 또는 물체 == 사물
객체지향이란?
- 객체들 사이의 관계를 통해 프로그램을 구성
- 실생활에서의 객체들 사이의 상호작용을 묘사
기존 절차지향
- 기존의 절차지향 프로그램은 “절차”와 “데이터”로 구성
- 절차(procedure) : 서술들의 연속으로 수행되는 세부 명령
- 데이터(data) : 절차 수행에 필요한 정보 또는 절차 수행의 결과
- 데이터를 일련의 절차를 가공하여 최종 데이터를 만듦
객체지향으로의 전환
- 기존 절차지향 프로그램의 유지보수를 더 편하게 하기 위하여 도입하였다.
- 프로그램을 “행동”과 “상태”로 구성되는 객체들 사이의 관계로 구성
- 행동(action) : 객체가 수행할 수 있는 동작으로, 상태의 변화를 야기
- 상태(state) : 객체가 가지고 있는 특성 값
- 객체들이 연속된 행동을 수행하며 최종 상태로 변화
객체지향 개념
클래스(Class)
- 특성과 행등으로 정의되는 객체의 분류
- 특정 분류의 객체를 찍어내기 위한 정형화된 “틀”
- 특성(property) : 객체가 갖는 속성
- 행동(action) : 객체가 수행할 수 있는 동작
객체(Object)
- 클래스의 인스턴스가 오브젝트
- 상태와 행동을 갖는 클래스의 사례(instance)
- 클래스의 특성에 값들이 존재한다.
- “틀”인 클래스를 통해 찍어낸 “사물”
- 상태(Property) : 속성에 부여된 값
- 행동(Action) : 객체가 수행할 수 있는 동작(클래스에 정의된 것과 동일)
- 객체화 : 클래스(Object의 집합)로부터 인스턴스를 만들어내는 작업
추상화(Abstraction)
- 요약
- 객체 사용과 무관한 세부 구현을 감춤
- 사용자는 실제 구현을 보지 않고 객체가 제공하는 기능에 집중
- 객체가 “어떤 행동(what)”을 할 수 있는지에 초점
- 객체가 행동을 “어떻게(how)” 수행하는지는 감춤
- 추상 클래스(abstract class), 인터페이스(interface) 등의 지원
- 행동(action)의 형태만 제공
- 행동의 구현은 상속 또는 구현하는 클래스의 정의
캡슐화(Encapsulation)
- 객체의 내부 상태를 외부로부터 감춤
- 객체 내부의 정보를 외부에서 훔쳐쓰거나 비정상적으로 변경할 수 없도록 보호
- 클래스에 정의된 행동(action)을 통해서만 객체 내부 정보에 접근을 허용
- 접근 지정자(access modifier)를 통해 캡슐화를 진행
- public : 접근 제한 없음
- protected : 동일한 패키지 + 자식 클래스만 접근 가능
- default : 동일한 패키지내의 클래스만 접근 가능
- private : 클래스 내부에서만 접근 가능
상속(Inheritance)
- 세부분류를 만드는 작업
- 기존 클래스로부터 새로운 클래스를 파생
- 기존 클래스의 특성 및 행동을 물려받음
- 물려받은 특성 및 행동에 더해 자신만의 특성과 행동을 정의
- 기존 클래스의 기능을 “확장”한 새로운 클래스 정의
- “부모”와 “자식” 관계
- 부모 클래스(parent or super or base class) : 상속해준 클래스
- 자식 클래스(child or sub or derived class) : 상속받은 클래스
다형성(Polymorphism)
- 다양한 형태나 의미를 가질 수 없는 특성
- 여러 다른 객체를 하나의 타입으로 표현할 수 있는 힘
- 여러 다른 함수 호출을 하나의 호출문으로 표현할 수 있는 힘
- 정적 다형성(static polymorphism)과 동적 다형성(dynamic polymorphism)으로 구분
- 정적 다형성 : 형태나 의미가 컴파일 시점에 결정(컴파일러가 결정)
- 동적 다형성 : 형태나 의미가 실행 시점에 결정
- 프로그램을 효율적이고 아름답게 만들어주는 정수
객체지향 언어의 장점
- 코드의 재사용성이 높음
- 기존의 코드를 이용하여 새로운 코드를 작성하기 용이함
- 코드의 관리가 쉬움
- 객체간의 관계를 이용하여 적은 노력으로 쉽게 코드 변경이 가능
- 신뢰성 높은 프로그래밍이 가능
- 캡슐화를 통해 데이터를 보호하고 올바른 값을 유지
클래스및 객체
클래스와 객체의 용도
- 클래스는 객체의 형태를 정의해 놓은 것
- 객체의 특성과 행동을 정의하는 “틀”
- 객체를 생성하기 위해 사용
- 객체는 실존하는 사물 또는 개념
클래스의 구성요소
- 클래스는 객체가 갖는 특성과 행동으로 구성
- 클래스에 정의된 특성과 행동은 클래스로부터 생성된 객체의 “멤버”
- 특성 : 변수 or 멤버
- 행동 : 함수 or 메소드
클래스의 객체화
1
2
3
4
5
6
7
| classname varname;
varname = new classname();
Car myCar;
myCar = new Car();
Car myCar = new Car();
|
객체의 멤버 접근
1
2
3
4
5
6
7
8
| varname.member
Car myCar = new Car();
myCar.curSpeed = 0;
myCar.pushAccel();
myCar.pushBreak();
myCar.getSpeed();
|
세가지 변수 종류
인스턴스 변수
- 객체의 상태를 구성하는 변수
- “참조변수.인스턴스변수명”으로 접근
Test t = new Test(); t.x = 5;
스태틱 변수
- 클래스에 귀속되어 해당 클래스의 모든 객체가 공유하는 변수
- “클래스이름.스태틱변수명”으로 접근 :
Test.y = 2;
로컬 변수
- 해당 블록 내에서 정의되며, 블록 내에서만 접근 가능한 변수
1
2
3
4
5
6
7
8
| class Test {
int x; // 인스턴스 변수
static int y; // 스태틱 변수
void foo() {
int z; // 로컬 변수
}
}
|
메소드
- 객체의 행동을 나타내는 함수
- 클래스 내에 정의
- 어떤 값을 입력으로 받아(받지 않을 수도 있음)
- 객체의 상태를 변화시키고(변화시키지 않을 수도 있음)
- 결과값을 반환(반환 값이 없을 수도 있음)
1
2
3
4
5
| class Test {
int add(int x, int y) {
return x + y;
}
}
|
메소드 호출과 상태 변화
- 수신자 객체(receiver object)가 메소드의 this 변수로 전달
this
변수의 멤버 변수 값을 변경하여 수신자 객체의 상태를 변경
this
생략 가능
두 가지 메소드 종류
인스턴스 메소드
- 객체의 행동을 정의한 함수
- “참조변수.인스턴스메소드명”으로 접근
Car c = new Car(); c.pushAccel();
- 수신자 객체가 this 변수로 전달되어, 객체의 상태 변화가 가능
스태틱 메소드
- 클래스에 귀속된 행동
- “클래스이름.스태틱메소드명”으로 접근
Car.honk();
- 수신자 객체가 없으므로, 객체의 상태 변화 불가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| class Car {
static String honkSound;
int curSpeed;
void pushAccel() {
curSpeed++;
}
void pushBrake() {
curSpeed--;
}
void changeSound(String sound) {
// 인스턴스 메소드에서 static 변수 쓰는건 OK
honkSoud = sound;
}
static String honk() {
curSpeed++; // Error : "this" is not accessible
return honkSound; // OK
}
}
|