본문 바로가기
JAVA

객체 지향 프로그래밍

by winteringg 2022. 8. 14.

<객체 지향 프로그래밍 (OOP, Object Oriented Programming)>
  - 부품 객체를 먼저 만들고, 이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법.

1. 클래스
1) 객체를 만들어 내기 위한 설계도 혹은 틀
2) 객체와 관련된 데이터와 처리 동작을 한데 모은 코드 뭉치
3) 클래스에는 객체를 생성하기 위해 연관되어 있는 변수와 메서드가 정의되어 있음.
4) 클래스 구성 멤버
  - 필드(Field) : 객체의 속성이나 고유 데이터가 저장되는 곳. 클래스 블럭{} 안에 있음. (ex. int fieldName;)
  - 생성자(Constructor) : 객체 생성시 초기화 역할 담당이며 생성자 이름은 클래스 이름과 동일해야 하고 리턴 타입이 없음.
       - ex. ClassName() {..실행문..}
  - 메서드(Method) : 객체의 동작에 해당하는 실행 블록이며 리턴 타입이 있음.
       - ex. void methodName() {..실행문..}

2. 인스턴스
1) 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스 라고 함. 객체의 실체화 = 인스턴스화
2) 객체가 메모리에 'new' 를 사용하여 할당되어 실제로 사용될 때 인스턴스라고 부름. 

Scanner scanner = new Scanner(System.in);

3) 구체적인 상태(변수) 와 행위(기능) 의 집합
4) 각기 속성들이 가지고 있어야 할 정보들은 각각 다를 것임.
5) 이러한 속성들은 각각 다른 “상태와 행위" 를 가짐.
6) 인스턴스 멤버 : 객체(인스턴스)마다 가지고 있는 필드와 메소드.

3. 객체 (Object)
1) 우리가 표현할 수 있는 실 세계의 모든 물리적 사물, 추상적인 개념 중에서 자신의 속성과 동작을 가지는 모든 것.
2) 물리적인 객체, 개념적인 객체로 나눌 수 있음.
  - 팰리세이드, 개, 고양이
  - 자동차, 동물
  - 학생, 회원, 주문, 배송

객체화

3) 프로그래밍의 객체화는 클래스라는 설계도를 바탕으로 필드(속성)과 메소드(동작)으로 실체화 된 것을 의미.
  - 객체는 서로 간에 메소드를 호출하고 결과값을 받는데, 아래 처럼 형식화할 수 있음.

리턴값 = 계산기객체.더하기메소드(매개값 1, 매개값 2,...);  

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

(도트(.) 연산자는 객체의 필드와 메소드에 접근하기 위해 사용함)


4) 하나의 클래스로부터 여러가지 객체를 만들 수 있음.
5) 객체 지향 프로그램에서 객체는 다른 객체와 집합 관계, 사용 관계, 상속 관계를 맺고 있음.
  - 집합 관계 : 완성품과 부품의 관계
  - 사용 관계 : 객체가 다른 객체를 사용하는 관계
  - 상속 관계 : 종류 객체와 구체적인 사물 객체 관계

객체 간 관계 특징 : 집합 관계, 사용 관계, 상속 관계


4. 객체 지향 프로그래밍 특징
1) 상속 : 상위(부모) 객체의 필드와 메소드를 하위(자식) 객체에게 물려주는 것. 하위 객체는 상위 객체를 확장해서 (상위 객체에 없는) 추가적인 필드와 메소드를 가질 수 있음.
  - 효과 : 반복된 코드의 중복을 줄여주며, 유지 보수의 편리성을 제공해 줌. (상위 객체에서 수정하면 하위 객체에 그대로 반영되기 때문에)
2) 다형성 : 같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질.
  - 효과 : 객체를 부품화 시킬 수 있고 유지보수가 용이해 짐. (여러 가지 객체를 만들어 놓고 그때 그때 마다 객체를 바꿔서 쓸 수 있음. (ex. 한국 타이어 객체가 바람이 빠져도 금호 타이어 객체로 바꿔 끼우면 됨)
3) 캡슐화 : 객체의 필드, 메소드를 하나로 묶고 실제 구현 내용을 외부에 감추는 것. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있음.
  - 자바에서는 캡슐화된 멤버를 노출 시킬 것인지를 결정하기 위해 접근 제한자를 사용함.
  - 효과 : 외부의 잘못된 사용으로 인해 객체가 손상되어 발생하는 오류를 최소화 함.
4) 객체 지향 프로그램 구현
  - 클래스를 설계하고 객체를 정의하고 new 연산자를 이용하여 객체를 생성함.
  - 각 객체가 제공하는 기능들을 구현.
  - 각 객체가 제공하는 기능들 간의 소통(메시지 전달)을 통하여 객체 간의 협력 구현.
    
5. 객체를 클래스로 구현해 보기
1) 객체 찾아보기
  - 온라인 쇼핑몰에 회원 로그인을 한 후, 여러 판매자가 판매하고 있는 제품 중에 하나를 골라 주문.
  => 객체 : (회원) (판매자) (제품) (주문)

2) 추상화 (Abstraction) : 객체에서 특징적인 속성과 행위를 추출하는 과정
            객체           목적           객체 예          클래스
            ------------------------------------------------------
            탈것          개인,이륜     자전거,오토바이      Bike
                             자동차       승용차,버스,트럭      Car
                           운송 수단     자동차,배,비행기    Vehicle

  - 추상화 작업(과정)
    * '특징' 같은 명사적인 특징을 뽑아냄 => 멤버 변수(필드) 추출
    * '동작' 같은 동사적인 특징을 뽑아냄 => 멤버 함수(메서드) 추출

  - 클래스는 객체를 프로그래밍에서 사용하려고 추상화해서 기술해놓은 설계도.
  - 프로그래밍에서 사용하려면 설계도를 기초로 실제로 만들 필요가 있음.
  - 이 것을 표현할 때 '객체를 생성한다.', '인스턴스화 한다' 라고 함.
  - 소프트웨어에서 객체는 클래스라는 설계도대로 구현한 것을 메모리에 탑재해 메모리 주소를 부여한 것을 의미.

6. 객체 생성과 클래스 변수
1) new 연산자 : 객체를 생성하는 역할. 
2) 예시
       Car myCar = new Car();
  => Car(클래스 타입) myCar(참조 변수) = new (객체 생성(인스턴스화)) Car() (생성자);
  - new 연산자가 객체를 생성하면 객체 생성 주소는 힙(heap) 영역에 생성됨.
  - 이 new 연산자에 의해 생성된 객체가 대입된 참조변수와 객체 생성 주소가 스택(stack)에 저장 됨.

 

 

 

참고 : [한빛미디어] 이것이 자바다 (신용권의 Java 프로그래밍 정복) Chapter 6.클래스

'JAVA' 카테고리의 다른 글

String 타입과 클래스  (0) 2022.08.16
패키지 (package) 와 import  (0) 2022.08.14
연산자  (0) 2022.08.14
관심사의 분리(separation of concerns, SoC)  (0) 2022.08.14
상수와 리터럴  (0) 2022.08.14

댓글