-
[패스트캠퍼스] Java & Spring 웹 개발 종합반 3주차 학습일지패스트캠퍼스/Java & Spring 웹 개발 종합반 2023. 2. 26. 22:31
내일배움카드, 국비지원교육
Chapter 3. 객체 지향 핵심
01. 객체 간의 상속은 어떤 의미일까
extends 키워드 뒤에는 단 하나의 클래스만 올 수 있음. 자바는 단일 상속만을 지원함
03. 상속에서 클래스 생성 과정과 형 변환
하위 클래스를 생성하면 상위 클래스가 먼저 생성됨
클래스가 상속받은 경우 하위 클래스의 생성자는 반드시 상위 클래스의 생성자를 호출함
하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로의 묵시적 형변환이 가능함
상속 관계에서 모든 하위 클래스는 상위 클래스로 형변환이 됨
04. 메서드 재정의하기
오버라이딩 : 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음
@Override 어노테이션
- 어노테이션은 원래 주석이라는 의미
- 컴파일러에게 특별한 정보를 제공해주는 역할
05. 메서드 재정의와 가상 메서드 원리
가상 메서드 테이블(virtual method table)에서 해당 메서드에 대한 address를 가지고 있음
재정의 된 경우는 재정의 된 메서드의 주소를 가리킴
06. 다형성과 다형성을 사용하는 이유
다형성이란? (polymorphism)
- 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
- 같은 코드에서 여러 다른 실행 결과가 나옴
- 정보은닉, 상속과 더불어 객체지향 프로그래밍의 가장 큰 특징 중 하나임
다형성을 사용하는 이유?
- 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현
- 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음
import java.util.ArrayList; class Animal { public void move() { System.out.println("동물이 움직입니다."); } public void eating() { } } class Human extends Animal { @Override public void move() { System.out.println("사람이 두 발로 걷습니다."); } public void readBook() { System.out.println("사람이 책을 읽습니다."); } } class Tiger extends Animal { @Override public void move() { System.out.println("호랑이가 네 발로 뜁니다."); } public void hunting() { System.out.println("호랑이가 사냥을 합니다."); } } class Eagle extends Animal { @Override public void move() { System.out.println("독수리가 하늘을 날아다닙니다."); } public void flying() { System.out.println("독수리가 양날개를 쭉 펴고 날아다닙니다."); } } public class AnimalTest { public static void main(String[] args) { Animal hAnimal = new Human(); Animal tAnimal = new Tiger(); Animal eAnimal = new Eagle(); /* * AnimalTest test = new AnimalTest(); test.moveAnimal(hAnimal); * test.moveAnimal(tAnimal); test.moveAnimal(eAnimal); */ ArrayList<Animal> animalList = new ArrayList<>(); animalList.add(hAnimal); animalList.add(tAnimal); animalList.add(eAnimal); for(Animal animal : animalList) { animal.move(); } } public void moveAnimal(Animal animal) { animal.move(); } }
07. 상속은 언제 사용할까
IS-A 관계 (is a relationship : inheritance)
- 일반적인 개념과 구체적인 개념과의 관계
- 상위 클래스 : 하위 클래스보다 일반적인 개념
- 하위 클래스 : 상위 클래스보다 구체적인 개념들이 더해짐
- 상속은 클래스 간의 결합도가 높은 설계
- 상위 클래스의 수정이 많은 하위 클래스에 영향을 미칠 수 있음
- 계층구조가 복잡하거나 hierarchy가 높으면 좋지 않음
HAS-A 관계 (composition)
- 클래스가 다른 클래스를 포함하는 관계
- 코드 재사용의 가장 일반적인 방법
- 상속하지 않음
08. 다운 캐스팅과 instanceof
다운 캐스팅
- 업캐스팅된 클래스를 다시 원래의 타입으로 형 변환
- 하위 클래스로의 형 변환은 명시적으로 해야 함
instanceof를 이용하여 인스턴스 형 체크
- 원래 인스턴스의 형이 맞는지 여부를 체크하는 키워드. 맞으면 true 아니면 false를 반환함
09. 추상 클래스의 의미와 구현하는 방법
추상 클래스란?
- 구현 코드 없이 메서드의 선언만 있는 추상 메서드를 포함한 클래스
- abstract 예약어를 사용
10. 추상 클래스를 활용한 템플릿 메서드 패턴
템플릿 메서드
- 추상 메서드나 구현된 메서드를 활용하여 코드의 흐름을 정의하는 메서드
- final로 선언하여 하위 클래스에서 재정의 할 수 없게 함
- 프레임워크에서 많이 사용되는 설계 패턴
- 추상 클래스로 선언된 상위 클래스에서 템플릿 메서드를 활용하여 전체적인 흐름을 정의하고 하위 클래스에서 다르게 구현되어야 하는 부분은 추상 메서드로 선언하여 하위 클래스에서 구현하도록 함
final 예약어
- final 변수 : 값이 변경될 수 없는 상수
- final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드
- final 클래스 : 상속할 수 없는 클래스
11. 구현 코드가 없는 인터페이스
인터페이스란?
- 모든 메서드가 추상 메서드로 선언됨
- 모든 변수는 상수로 선언됨
인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환 할 수 있음
상속에서의 형 변환과 동일한 의미
클래스 상속과 달리 구현 코드가 없으므로 여러 인터페이스를 구현할 수 있음
형 변환되는 경우 인터페이스에 선언된 메서드만을 사용가능함
12. 인터페이스는 왜 사용하는가
클래스나 프로그램이 제공하는 기능을 명시적으로 선언
일종의 클라이어트 코드와의 약속이며, 클래스나 프로그램이 제공하는 명세
클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
인터페이스를 구현한 다양한 객체를 사용함 - 다형성
14. 인터페이스의 여러가지 요소
상수 : 모든 변수는 상수로 변환됨
추상 메서드 : 모든 선언된 메서드는 추상 메서드
디폴트 메서드 : 구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 사용할 수 있는 기본 메서드
정적 메서드 : 인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수 있는 메서드
private 메서드
- 인터페이스를 구현한 클래스에서 사용하거나 재정의 할 수 없음
- 인터페이스 내부에서만 사용하기 위해 구현하는 메서드
- default 메서드나 static 메서드에서 사용함
15. 여러 인터페이스 구현하기, 인터페이스의 상속
여러 인터페이스 구현
- 자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스를 구현할 수 있음
- 디폴트 메서드가 중복되는 경우 구현하는 클래스에서 재정의 해야 함
- 여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스에 선언된 메서드만 사용 가능 함
인터페이스의 상속
- 인터페이스 사이에도 상속을 할 수 있음
- 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속이라고 함
16. 복습해보세요
Player가 있고 Player는 GameLevel 속성을 가집니다.
각 GameLevel 단계 마다 run(), jump(), turn() 세 가지 기능이 업그레이드 됩니다.
초보자 레벨 : 천천히 달립니다. run()만 가능
중급자 레벨 : 빠르게 달리고, 점프할 수 있습니다(2번). run(), jump() 가능
고급자 레벨 : 엄청 빠르게 달리고, 높게 점프하고(3번), 턴할 수 있습니다. run(), jump(), turn() 가능
Player는 한번에 하나의 레벨 상태만을 가질 수 있습니다.
Player가 play() 중에 레벨에 있는 go(int count)라는 메서드를 호출하면 run()하고 count 횟수만큼 jump() 하고 turn() 합니다.고객센터에 전화상담을 하는 상담원들이 있습니다.
일단 고객에게서 전화가 오면 대기열에 저장되고 각 상담원에게 배분이 됩니다.
배분이 되는 정책은 크게 세 가지가 있습니다.
1. 모든 상담원들이 동일한 상담 건수를 처리하도록 상담원 순서대로 배분합니다.
2. 쉬고있거나 상담원에게 할당된 통화 수가 가장 적은 상담원에게 배분합니다.
3. 고객의 등급에 따라 등급이 높은 고객은 업무능력이 우수한 상담원에게 배분합니다.
세 가지 정책은 필요에 따라 바뀌어 운영될 수 있습니다.이론적으로는 다 이해가 되는데
막상 코드를 작성하려니까 손이 움직이지 않는다😥
여러 번 반복해보기!
Chapter 4. 자바의 유용한 클래스들
01. Object 클래스
java.lang 패키지 : 프로그래밍시 import 하지 않아도 자동으로 import 됨 (String, Integer, System 등)
모든 클래스는 Object 클래스를 상속받는다
- Object 클래스의 메서드 중 일부는 재정의해서 사용할 수 있음
02. Object 클래스의 메서드 활용
clone() 메서드 : 객체의 원본을 복제하는 데 사용하는 메서드, cloneable 인터페이스 명시해야 함
03. String, StringBuilder, StringBuffer 클래스, text block
StringBuilder, StringBuffer 활용
- 내부적으로 가변적인 char[]를 멤버 변수로 가짐
- 새로운 인스턴스를 생성하지 않고 char[]를 변경함
- StringBuffer는 멀티스레드 프로그래밍에서 동기화를 보장함
text block (java 13)
- 문자열을 """ """ 사이에 이어서 만들 수 있음
- html, json 문자열 만들 때 유용
04. Class 클래스 사용하기
Class 클래스
- Class 클래스는 컴파일 된 class 파일을 로드하여 객체를 동적 로드하고, 정보를 가져오는 메서드가 제공됨
- Class.forName("클래스 이름")
동적 로딩
- 컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행 중에 데이터 타입을 binding 하는 방법
- 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 오류가 발생하면 프로그램의 심각한 장애 발생 가능
Class의 newInstance() 메서드를 사용하면 new 키워드를 사용하지 않고 인스턴스 생성 가능
reflection 프로그래밍
- Class 클래스를 사용하여 클래스의 정보 등을 알 수 있고, 인스턴스를 생성하고 메서드를 호출하는 방식
- 로컬 메모리에 객체가 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
- 일반적응로 자료형을 알고 있는 경우엔 사용하지 않음
'패스트캠퍼스 > Java & Spring 웹 개발 종합반' 카테고리의 다른 글
[패스트캠퍼스] Java & Spring 웹 개발 종합반 6주차 학습일지 (0) 2023.03.19 [패스트캠퍼스] Java & Spring 웹 개발 종합반 5주차 학습일지 (0) 2023.03.10 [패스트캠퍼스] Java & Spring 웹 개발 종합반 4주차 학습일지 (1) 2023.03.05 [패스트캠퍼스] Java & Spring 웹 개발 종합반 2주차 학습일지 (0) 2023.02.19 [패스트캠퍼스] Java & Spring 웹 개발 종합반 1주차 학습일지 (0) 2023.02.13