3 minute read

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
  }
} 

Categories:

Updated: