The A :

728x90
반응형

Today I Lean

객체지향 _ 다형성과 추상화

 

 

실제로 코드를 구현하라고 하면 물론 어렵고 생각도 안나고 힘들겠지만, 일단 개념을 이해했다는 것에서 너무 만족스러운 하루였다.

이제까지는 이해도 못하고 구현도 못해서 우울했는데, 그래도 내가 이해는 할 수 있는 사람이었구나 라는걸 느낄 수 있어서 행복하고 앞으로 더 열심히 할 수 있을것만같은 기분이 든다.

내일것을 잠깐 보니까 주문프로그램을 만드는 것 인데,, 잘 할수 있을지는 모르겠지만 그래도 이제까지 정리 해 둔것을 다시 읽고 알아보면서 천천히 해보면 그래도 만들수 있지 않을까....?

오늘 편안하게 공부했으니 내일은 빡세게 해보자!

 

 

 

학습목표 및 개념정리

# 다형성 (Polymorphism)

- 다형성의 의미와 장점을 이해할 수 있다.

- 참조변수의 타입 변환에 대한 내용을 이해하고, 업캐스팅과 다운캐스팅의 차이를 설명할 수 있다.

- instanceof 연산자를 활용하는 방법을 이해하고, 설명할 수 있다.

- 다형성이 실제로 어떻게 활용되는지 알 수 있다.

 

# 추상화 (Abstraction)

- 추상화의 핵심 개념과 목적을 알 수 있다.

- abstract 제어자가 내포하고 있는 의미를 이해하고, 어떻게 사용되는지 설명할 수 있다.

- 추상 클래스의 핵심 개념과 기본 문법을 이해할 수있다.

- final 키워드를 이해하고 설명할 수 있다.

- 추상화에서 핵심적인 역할을 수행하는 인터페이스의 개념과 활용 방법을 이해할 수 있다.

- 추상 클래스와 인터페이스의 차이를 설명할 수 있다.

 

 

 

 

배운 것

# 다형성 (Polymorphism)

1. 다형성 이란?

 : poly(여러개) + morphism(실체/형태) = 하나의 객체가 여러가지 형태를 가질 수 있는 성질

 : 자바에서의 다형성

 → 한 타입의 참조변수를 통해 여러타입의 객체를 참조할 수 있도록 만든 것

 → 상위 클래스 타입의 참조변수를 통해, 하위 클래스의 객체를 참조할 수 있도록 허용한 것

 

: 하위클래스의 객체를 상위 클래스의 참조변수타입으로 지정하면

 → 하위 클래스의 참조변수가 사용할 수 있는 멤버의 개수는 상위클래스 멤버의 수가 됨

 

: 하위 클래스의 타입으로 상위클래스 객체를 참조하는 것은 불가능

Friend friend = new Friend(); // 객체 타입과 참조 변수 타입의 일치 -> 가능
BoyFriend boyfriend = new BoyFriend();
Friend girlfriend = new GirlFriend(); // 객체 타입과 참조 변수 타입의 불일치 -> 가능
//  GirlFriend friend1 = new Friend(); -> 하위클래스 타입으로 상위클래스 객체 참조 -> 불가능

 

 

2. 참조 변수의 타입 변환

 : 사용할 수 있는 멤버의 개수를 조절하는 것

 → 서로 상속관계에 있는 상위-하위 클래스 에서만 타입변환이 가능

 → 하위에서 상위 클래스 타입으로 변환(업캐스팅)은 형 변환 연산자(괄호)를 생략 가능

 → 상위에서 하위 클래스 타입으로 변환(다운캐스팅)은 형 변환 연산자(괄호) 필수! ( 업 캐스팅이 되어있다는 전제하에 다운 캐스팅이 가능)

(헷갈리지 않으려면 그냥 형 변환 연산자를 항상 사용하는 것도 나쁘지는 않을 듯..?)

 

 

3. instanceof 연산자

 : 캐스팅이 가능한지 여부를 boolean 타입으로 확인 하는 문법

 → 생성 객체의 타입을 확인하기가 어려운 상황에서 instanceof 연산자는 형 변환 여부를 확인하여 에러를 최소화하는 매우 유용한 수단

참조_변수 instanceof 타입
System.out.println(animal instanceof Object);
// 해석 : 참조변수 animal 을 Object로 타입변환을 할 수 있는가?

 

4. 다형성 활용

 : 중복으로 써야 하는 코드를 현저히 줄이고 보다 편리하게 코드를 작성할 수 있음

 

 

 

 

 

# 추상화 (Abstraction)

1. 추상화 란?

 - 추상의 사전적 정의

 : 사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는것

 → 기존 클래스 들의 공통적인 요소들을 뽑아서 상위 클래스를 만들어 내는 것

 

 

2. abstract 제어자

 : 클래스와 메서드를 형용하는 키워드로 주로 사용

 : 추상 메서드 (메서드 앞에 붙은 경우), 추상 클래스 (클래스 앞에 붙은 경우)

 → 클래스에 추상 메서드가 포함되어 있으면 그 클래스는 자동으로 추상 클래스가 됨

 

- 추상 메서드 (abstract method)

: 메서드 시그니처만 있고, 바디가 없음

 → 앞에 abstract을 붙여서 해당 메서드가 추상 메서드 임을 표시

 → 구체화 되지 않은 미완성 메서드 (바디가 없어서 구체적으로 명시되지 않음)

AbstractExample abstractExample = new AbstractExample(); // 에러발생. 

 → 미완성 이기 때문에 메서드 바디가 완성되기 전까지는 객체 생성또한 불가능

 

 

3. 추상 클래스 (abstract class)

 : 상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용

 : 메서드의 내용이 상속받는 클래스에 따라 달라지기 때문에 선언부만 작성하고 바디는 상속받는 하위 클래스에서 구현하도록 비워둠  → 보다 유연하게 변화에 대응 가능

 

 → 추상메서드를 하나이상 포함하는것 외에는 일반클래스와 동일

 → 상속을 받는 하위 클래스에서 오버라이딩을 통해 각각 상황에 맞는 메서드 구현이 가능함

 

상속계층도의 상층부에 위치할수록 추상화의 정도가 높고 그 아래로 내려갈수록 구체화

즉, 상층부에 가까울수록 더 공통적인 속성과 기능들이 정의됨

 

 

4. final 키워드

 : 핃드, 지역 변수, 클래스 앞에 위치할수 있고 위치에 따라 의미가 달라짐

위치 의미
클래스 변경 또는 확장 불가능한 클래스, 상속 불가
메서드 오버라이딩 불가
변수 값 변경이 불가한 상수

 → 공통적으로 변경불가, 확장불가

final class FinalEx { // 확장/상속 불가능한 클래스
	final int x = 1; // 변경되지 않는 상수

	final int getNum() { // 오버라이딩 불가한 메서드
		final int localVar = x; // 상수
		return x;
	}
}

(final 클래스를 만들고, 그 안의 메서드나 변수에 final을 사용하지 않았을 경우 final 클래스의 영향을 받아 내부의 아이들도 final이 되는건지 궁금해서 chatGPT에게 물어봄 → final 키워드는 각각 설정해야 변경불가 성질을 가지게 됨, final 클래스를 만들었다고 해서 그 내부까지 final은 아니기 때문에 상속만 불가능하고 내부값은 변경이 가능함)

 

 

5. 인터페이스 (interface)

 : 서로 다른 두 시스템, 장치, 소프트웨어 등을 이어주는 부분/접속장치

 : 추상클래스보다 더 높은 추상성을 가지는 가장 기초적인 밑그림

 → 추상메서드와 상수만을 멤버로 가질수 있음(추상화 정도 ↑, 추상메서드의 집합)

 

- 기본 구조

: class 대신 interface 사용

 : 내부의 모든 필드가 public static final 로 정의

 : static과 default메서드 외의 모든 메서드는 public abstract로 정의 됨

 → 다만 모든 인터페이스의 필드와 메서드에는 위의 내용이 내포되어 있기 때문에 생략이 가능함

 

- 구현

 : 그 자체로 인스턴스 생성이 불가능, 메서드바디를 정의하는 클래스를 따로 작성해야함

 → implements 키워드 사용

 → 인터페이스를 구현한 클래스는 모든 인터페이스의 메서드를 구현해야 하지만, 디폴트 메서드나 정적 메서드는 선택적으로 구현할 수 있다.

class 클래스명 implements 인터페이스명 {
		... // 인터페이스에 정의된 모든 추상메서드 구현
}

 → 어떤 클래스가 어떤 인터페이스를 구현한다는 것은 그 인터페이스가 가진 모든 추상 메서드들을 해당 클래스 내에서 오버라이딩하여 바디를 완성한다는 의미

 

- 다중구현

: 상속(extends)과는 달리 인터페이스(interface)는 다중구현이 가능함

 → 하나의 클래스가 여러개의 인터페이스를 구현할 수 있음.

 → 다만, 인터페이스-인터페이스 끼리만 상속이 가능하고 클래스와는 달리 최고 조상이 존재하지 않음

[ 다중상속(다중구현)이 가능한 이유 : 클래스는 부모와 자식 모두 멤버를 가지고 있어서 충돌이 발생하지만, 인터페이스는 미완성된 멤버를 가지고 있기 때문에 충돌하지 않음 ]

interface Animal { // 인터페이스 선언. public abstract 생략 가능.
	public abstract void cry();
} 

interface Pet {
	void play();
}

class Dog implements Animal, Pet { // Animal과 Pet 인터페이스 다중 구현
    public void cry(){ // 메서드 오버라이딩
        System.out.println("멍멍!"); 
    }

    public void play(){ // 메서드 오버라이딩
        System.out.println("원반 던지기");
    }
}

 

 

 

*****

업캐스팅 / 다운캐스팅

 

타입변환은 왜 하는지?

 

다형성 Object

 

  public class Main {
        public static void main(String[] args) {
            Customer customer = new Customer();
            customer.buyCoffee(new Americano());
            customer.buyCoffee(new CaffeLatte());
        }
  }

non-static method buyCoffee(Coffee) cannot be referenced from a static context

위에서 만든 customer 객체를 가져와서 buyCoffee()를 호출 해야 하는데 C를 대문자로 잘못 적어서 오류가 남

 

 

 

Tomorrow Chapter

# BurgerQueen 주문 프로그램 만들기

 

 

 


 

 

↓ 이전 글 ↓

 

[코드스테이츠] 04_25_TIL : 상속과 캡슐화

Today I Lean 상속과 캡슐화 어제 의도치 않게 접근제어자와 getter/setter에 대해 공부 했더니 오늘 강의를 따라가는게 쉬웠다. 이렇게 깔끔하게 이해되고, 편안하게 공부했던적이 정말 오랜만인듯 하

theflower01.tistory.com

 

↓ 코트스테이츠 부트캠프 관련 글 한번에 보기 ↓

 

'IT/코드스테이츠 부트캠프' 카테고리의 글 목록

Flower, Plant, Study

theflower01.tistory.com

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading