[Java] 객체지향 프로그래밍(OOP)

yyy·2024년 2월 27일

playdata

목록 보기
1/4

객체 지향 프로그래밍

  • 객체(object) : 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있으면서 식별 가능한 것
    ex) 자동차, 자전거, 책, 사람
    • 속성(field) : ex) 자동차 - 색깔, 모델명
    • 동작(method) : ex) 자동차 - 달린다, 멈춘다.
  • 모델링(object modeling) : 현실세계의 객체를 소프트웨어 객체로 설계하는 것. 즉 현실세계 객체의 속성과 동작을 추려내어 소프트웨어 객체의 필드와 ㅔ소드로 정의하는 과정

객체의 상호작용

객체들은 각각 독립적으로 존재하고 다른 객체와 서로 상호작용하면서 존재한다. 객체들 사이의 상호작용 수단이 메소드이다.
메소드 호출 : 객체가 다른 객체의 기능을 이용하는 것

  • 형태
    리턴값 = 객체.메소드(매개값1, 매개값2...)

ex)

int result = Calculator.add(10,20);

객체 간의 관계

객체는 개별적으로 사용될 수 있지만 대부분 다른 객체와 관계를 맺고 있다. 이 관계의 종류에는 집합관계, 사용관계, 상속관계가 있다.

  • 집합관계 :
  • 사용관계 :
  • 상속관계 :

객체와 클래스

  • 객체를 생성하는 순서 : 개발자 -> 클래스(설계도) -> 인스턴스(객체)
    • 클래스 : 객체(자동차)를 생성하기 위한 필드와 메소드가 정의됨
    • 인스턴스 : 클래스로부터 만들어진 객체(자동차)
  • 객체 지향 프로그래밍 개발 단계
  1. 클래스 설계
  2. 설계된 클래스를 가지고 사용할 객체 생성
  3. 생성된 객체 이용

클래스 선언

사용하고자 하는 객체를 구상했다면 그 객체의 대표이름을 하나 결정하고 이것을 클래스 이름으로 정한다.
예를들면 사람 객체의 클래스는 Person, 자동차 객체의 클래스는 Car

클래스 이름을 정했다면 '클래스이름.java' 로 소스파일을 생성해야 한다.

객체 생성과 클래스 변수

클래스를 선언한 다음, 컴파일을 했다면(저장) 객체를 생성할 설계도가 만들어진 셈이다. 클래스로부터 객체를 생성하려면 다음과 같이 new 연산자를 사용하면 된다.

new 클래스();

new는 클래스로부터 객체를 생성시키는 연산자이다. new연산자 뒤에는 생성자가 오는데, 생성자는 클래스() 형태를 가지고 있다. new 연산자로 생성된 객체는 메모리힙(heap) 영역에 생성된다.

현실세계에서 물건의 위치를 모르면 물건을 사용할 수 없듯이, 객체지향 프로그램에서도 메모리 내에서 생성도니 객체의 위치를 모르면 객체를 사용할 수 없다. 그래서 new 연산자는 힙 영역에서 객체를 생성시킨 후 객체의 번지를 리턴하도록 되어있따.
이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용할 수 있다.
다음은 클래스로 선언된 변수에 new 연산자가 리턴한 객체의 번지를 저장하는 코드이다.

클래스 변수;
변수 = new 클래스();

클래스 변수 선언과 객체 생성을 1개의 실행문으로 작성할 수도 있다,

클래스 변수 = new 클래스();

  • 캡슐화(encapsulation) : 다른 사람이 구현한 객체의 메서드를 호출할때는 내부에서 무슨일이 일어나는지 몰라도 된다. 이 원칙을 캡슐화라고 한다.

추상화 (abstraction)

'추상'이라는 용어는 사물이나 표상을 어떤 성질이나 공통성, 본질에 착안하여 이를 추출하고 파악하는 것이다. 즉 자바에서 추상화에 대한 핵심개념으로는 공통성과 본질을 모아 추출하는 것에 있다.

추상화의 공통성과 본질을 모아 추출하는 것은 객체의 공통적인 속성과 행위를 추출하여 정의하는 것을 말한다.

ex) 자동차, 오토바이의 공통적인 속성과 행위
속성 - 제조업체, 가격, 모델명
행위 - 시동을 건다. 앞으로 간다. 정지한다.
-> 이러한 공통적인 속성과 행위들을 모아 이동수단이라는 클래스를 담을 수 있다.

abstract 제어자

추상 메서드는 충분히 구체화되지 않은 미완성된 메서드이며, 미완성 메서드를 포함하는 클래스는 미완성된 클래스를 의미하는 추상 클래스가 된다.
따라서 추상 클래스는 객체 생성이 불가능하다.

abstract class AbstractClassEx { // 추상 클래스
    abstract void abstractMethod(); // 메서드 바디가 없는 추상 메서드
}
// 객체 생성 불가능 (에러 발생)
AbstractClassEx abstractObject = new AbstractClassEx();

추상클래스 vs 인터페이스

자바에서 추상화를 구현할 수 있는 문법요소로는 추상클래스(abstract class)와 인터페이스(interface)가 있다.

추상클래스 vs 인터페이스 사용처

인터페이스나 추상클래스 둘 다 추상메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다.
하지만 이 둘은 각각 고유의 몇몇 특징들을 가지고 있는데, 이러한 특징으로 인해 사용처가 달라진다.

  • 추상클래스 : extends 키워드를 사용해서 자신의 기능들을 하위클래스로 확장
  • 인터페이스 : inplements 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현

추상화 예시

<Vehicle.java>

<Car.java>

<Motobike.java>

<main.java>

상속 (Inheritance)

: 상위클래스의 모든것을 하위클래스가 이어받는 것이다. 즉, 이미 완성된 클래스(상위클래스)의 특성을 그대로 이어받아 새로운 클래스(하위클래스)를 생성하는 기법이다.

클래스 상속

상속받고자 하는 자식 클래스명 옆에 extends 키워드를 붙이고, 상속할 부모 클래스명을 적는다.
자바는 다중상속을 허용하지 않으므로, extends 뒤에는 하나의 부모 클래스만 와야 한다.

public class Car extends Vehicle {

<Vehicle.java>
model, color, wheels

start() {}
moveForward() {}
moveBackward() {}

<Car.java>
isCovertible
openWindow() {}

<Motobike.java>
isRaceable
stunt() {}

q
<Main.java>

다형성(Polymorphism)

다형성이란 여러개를 의미하느 poly와 형태 또는 실체를 의미하는 morphism의 결합어로, 하나의 객체가 여러가지 형태를 기질 수 있는 것을 의미한다.

자바에서 다형성은 한 타입의 참조변수를 통해 여러타입의 객체를 참조할 수 있도록 하는 것이다. 즉 상위클래스 타입의 참조변수를 통해 하위클래스의 객체를 참조할 수 있도록 하여 상위 클래스가 동일한 메시지로 하위클래스들이 서로 다른 동작을 할 수 있도록 한다.

다형성의 조건

  • 상위클래스와 하위클래스는 상속관계여야한다.
  • 다형성이 보장되기 위해 오버라이딩(하위클래스 메서드의 재정의)이 필요하다.
  • 자식클래스의 객체가 부모클래스의 타입으로 형변환(업캐스팅)해야한다.

<Vehicle.java>

<Car.java>

0개의 댓글