https://gitlab.com/easyspubjava/javacoursework/-/tree/master/Chapter3
Chapter3 · master · easyspubjava / javacoursework · GitLab
GitLab.com
gitlab.com
extends 뒤에는 하나만
오버라이딩, 형변환polymorphism?
자바는 single inheritance다. 단일상속 언어다. 모호함이 없어짐
최근 기능이 확장되고 있지만,
기존 c++보다 안정성, 심플이 초기부터의 목표였다.
상속받는 클래스가 더 많이 올 수록 더 많은 기능확장이
그로 인해 발생하는 모호성이나 문제점은 없애버리자.
상속 구현하는 경우
일반적인 개념을 지닌 원래 클래스보다
기능이 많고 구체적이고 specific하다면 기존 클래스를 상속 받음
결이 같은 클래스일 때
-------------
if-else, if-else가 많다면 상속을 한번 생각해봐야한다.
클래스의 단일성이 망가져.
vip 클래스를 따로 만들자
private은 외부클래스에서 사용x
protected는 하위클래스에서는 접근가능 but, 외부클래스에서는 접근x
-------------
상속을 받기 때문에 상위클래스의 생성자를 호출해야함
but 코드에는 호출하는 코드가 없어.
컴파일러가 super(); 넣어주는 것.
this는 클래스가 생성된 인스턴스가 자기자신의 주소를 가지고 있을 떄
자기 클래스의 다른 생성자를 호출할수있는 기능이있다.
super 하위클래스가 상위클래스의 참조값을 지니게 됨.
this와 마찬가지로 생성자를 호출할 수 있는 기능을 지님
컴파일러가 아무 생성자가 없을 때 default constructor를 만들어주듯이
상위클래스를 호출하는 코드가 하나도 없으면 super();자동으로 넣어줌.
상위클래스의 생성자를 호출하는 게 자동으로 들어간다.
---------------------
하위클래스는 상위클래스를 내포하고 있기 때문에
형변환(업캐스팅)가능
Customer customerLee = new VIPCustomer();
상위클래스로 형변환이 되는 걸 업캐스팅
상위클래스로 형변환이 된 게 원래 자기 인스턴스 타입으로 오는 걸 다운캐스팅
업캐스팅은 implicit묵시적으로 가능
타입은 Customer. 인스턴스는 VIPCustomer로 다 만들어져있지만
변수와 메소드는 자기 타입것만 사용 가능. Customer만 사용 가능.
VIP거 쓰려면
다운캐스팅하거나 오버라이딩해야함.
상위클래스에서 구현된 코드를 하위클래스에서 재정의하는데
function signiture정의부분이 같아야함.(반환값, 메서드 이름, 매개변수)
갖지 않으면 다른 메서드인 것.
어노테이션 컴파일러에게 알려주는 annotation
컴파일 오류도 줄여줄 수 있고
인스턴스꺼가 쓰임
가상메서드
실제인스턴스의 메서드가 쓰임...
c++은 가상메서드표시위해 virtual이라는 키워드를 써야함.
자바는 virtual이라는 키워드 안쓰고 모든 메서드는 가상메서드
-------------
프로그램 실행시켜서(더블클릭해서) 로드가 되면
static, integer상수도 있는데
Data(상수, static)영역 : static과 리터럴 등
Code영역 : 프로그램의 함수, 메서드들. 기능은 인스턴스별로 다르지 않아(더하는 기능 같은 건 변하지 않아) instruction set.
변수가 다르지
근데 변수의 영역은 따로 잡힘
stack : 지역변수
heap : 인스턴스
참고)http://www.tcpschool.com/c/c_memory_structure
함수이름은 어드레스로 바뀜. 배열과 함수이름은 주소다. 원래 이름 같으면 안됨. 오버로딩이 가능한 이유는 더미파라미터 붙여서 조금씩 바꿈. 같은 이름의 함수는 없음.
함수 호출은 instruction set부분이 호출되는 것.
기능이 인스턴스마다 따로 생기지 않아(수행하는 기능의 set.)
인스턴스마다 따로 생기거나 함수호출될 때마다 따로 생기는 건 변수가 사용하는 영역
변수가 사용하는 영역과
함수의 instruction set명령어의 집합이 차지하는 영역은 다르다.
로직만 가지고 있는 것.
스택메모리의 메인이 차지하는 게 코드영역이 아니라
메인함수의 지역변수가 차지하는 영역
당연히 코드영역은 따로 있는 것.
생성된 실제 인스턴스는 힙메모리
출력이 실행되기 위해서 실제로 호출되는 영역은 코드영역
자바는 모든 메서드가 가상함수virtual function, 가상메서드 방식
함수의 이름에 매핑된 주소가 호출됨.
함수이름이 가르키는 어드레스에 대한 테이블이 따로있다.
가상메소드 테이블
다형성 여러 다른 클래스 타입을 가진,
그렇지만 동일하게 코드 호출해도 다양한 구현결과가 나오는 것
다형성의 구현으로 얼마나 flexalbe한 프로그램을 만들 수 있는지
-------------
코드는 한 줄인데 어떤 인스턴스형이 들어갔느냐에 따라
move의 implementation이 달라짐 =>다형성
원리는 상속(인터페이스로도 다형성 구현하지만)
메소드 오버라이딩했고
상위클래스로 형변환
상속하게 되면 하위클래스들을 상위클래스하나의 타입으로 모두 핸들링 가능
좋은 면도 있지만, 클래스간의 결합도가 타이트해진다고 얘기함
상위클래스 바꾸면 하위클래스에도 영향을 미칠 수 있다.
상속설계할 떄는 꼭 필요한 경우 신중하게 결정해야 함.
공통적으로 쓰일 수 있는 메서드는 상위클래스에 선언하면 됨.
상위클래스에서 선언된 공통메서드는 모든 하위클래스에서 같이 사용할 수 있다.
다형성이라는 부분은 다른 클래스들이 한꺼번에 마치 동일한 타입처럼 쓰이지만 실제적인 implementation구현은 다르게 각각 나타날 수 있다.
굉장히 확장성 있는 프로그램을 만들 수 있다.
상속할 때 뎁스깊게 가져가는 건 좋지 않아(골드를 vip에서 받기보단 customer에서 받아)
메서드 오버라이드 직접 쓸 수도 있지만 annotation들어가도록 하는 게 더 좋은 방법. 컴파일오류도 막아주기 때문
ctrl+shift+o : 자동 import 단축키
----------------
상속
base 클래스 - drived 클래스
업캐스팅은 implicit하게 묵시적으로 가능
다운캐스팅은 명시적으로 해야 함
(최상위 클래스라서 object클래스로 다 형변환 가능)
Customer vc = new VIPCustomer(); //묵시적
VIPCustomer vCustomer = (VIPCustomer)vc; //명시적
할수있다면 굳이 다운캐스팅 쓰지말고
다운캐스팅을 쓰면 코드가 많이 지저분해지고
각 타입으로 다시 되돌려야 해..
할수있다면 polymorphism다형성으로 오버라이딩해서 사용할 수 있는 게 코드가 깔끔.
반드시 원래타입으로 되돌려야한다면 instanceof로 타입확인하고 되돌리면 된다.
-----------------
템플릿 메서드
추상abstract <-> 구체적 concrete(반환값 메서드명 매개변수 : 시그니쳐, 선언/ 와 중괄호 바디, 구현부분)
인터페이스는 선언만으로 이루어져있다.
클래스 다이어그램(uml등으로 정교하게 그릴수도 있지만)
클래스명
변수
메서드
이탤릭체 : 추상
정자 : 구현된 것
추상클래스는 상속을 위한 클래스
일부는 구현을 할수도 있고
일부는 구현을 안할수도있다
다 구현을 안할수도 있다(이 경우 인터페이스로 하는 경우가 더 많음)
다 구현을 했어도 추상클래스 두는 경우는
상속만을 위해서 쓰는 클래스
인스턴스화하기 위한 게 아니라 이 클래스는 상속만을 위한 것이다.(JDK안에도 있고 이런 경우 종종 있다.)
----------
JDK (java development kit): 라이브러리
전반적인 구성과 흐름은 내가 구성
android : 프레임워크
흐름이 다 정해져 있다.
나는 place hole 구멍을 메꾸는 역할만 함.
final : 상수, 재정의 못하게, 클래스에 들어가면 상속 못 하게 하는 클래스
변수 - 상수, 메서드 - 재정의x, 클래스 - 상속x
public void washCar() {}
훅메서드라고 하는데 필요에 따라 하위클래스에서 재정의해서 사용가능
-----------
인터페이스는 상속이 아니라 "구현한다."
자바에서 상속은 single inheritance만 가능 여러개의 클래스를 상속 받을 수 없어. 모호성 때문
인터페이스는 구현코드가 없기 때문에 다중상속해도 모호성이 발생할 일이 없어
뭐가 불려야할지 모호하지 않아.
클래스는 여러개의 인터페이스를 implementation가능
-------------------------
프로그램 제공하는 쪽을 서버
사용하는 쪽을 클라이언트
서버가 어떻게 구현되어있는지 모르고 쓰는 클라이언트도 많이
서버는 이렇게 구현되어있어라는 인터페이스가 있으면 클라이언트가 인터페이스 보고 사용
ORACLE로 구현
MS-SQL
MySQL
연결하려면 커넥션이 필요함.
커넥션은 java에 정의되어있음.
커넥션을 생성해서
디비에 쿼리날리고 리절트셋result set을 받고
Interface Connection
오라클 디비랑 연결하려고 커넥션
statement도 인터페이스
ORACLE
MS-SQL
MySQL 가
jar 파일을 제공해줌 라이브러리 db드라이버라고 하는 것
jar 소스 까보지 않고
JDBC명세만 보고 함. 커넥션만 보고 함.
인터페이스가 하는 일은 이 모듈이 무슨 일을 해야된다라는 명세하고
쓰는 쪽에서는 걔가 어떻게 구현되는지 알수도 있지만 알 필요도 없이 인터페이스만 보고 구현하면 됨.
따라서 인터페이스 설계하는 게 굉장히 중요함.
실무에서 인터페이스 설계하고 여러개의 모듈을 replace하면서 쓸 때
호출하는 쪽에서는 코드가 바뀔일이 없어 어떤 모듈을 쓰건 간에 이 인터페이스 구현했다면 쓰는 방식은 동일. 인터페이스에 명세돼있는대로 쓴다
---------------
strategy?패턴? 다형성
DAO
코드를 이중으로 관리해야함. 오버헤드
버거패치를 일일이 힘듦.
여기선 없던 버그가 저기선 생기고
솔루션하는 회사에서 버전관리를 어떻게 하는지가 중요.
똑같은 인터페이스 활용해서 메서드 호출하지만
다른 인스턴스 돌아감
같은 코드가 여러가지 implementation가지는 게 다형성이니까
인터페이스가 어떻게 다형성으로 활용되느냐
실무에서 중요한 건 인터페이스 설계
어떻게 설계해야 클라이언트 프로그램이 유용하게 쓸 수 있느냐 고민
설계하는 작업들을 시니어프로그래머가 하는 것.
hierachy
패키지는
소스의 계층구조를 갖는다.
단위구분하는데만 쓰는게 아니라 실제적으로는 hierachy를 가지면서
많은 고민들을 함
처음 설계할 때
Package Explorer 옆에 세로 점 3개누르면
Package Presentation에서 Flat->hiereachical
실제 operation할 때는 다른 프레임워크 쓸 수도 있고
jdbc를 그냥 나이브하게 쓴다면 커넥션 연결해서 statement에다가 sql실어서 쿼리 날림.
------
Properties prop = new Properties();
ㄴ>키-밸류를 쌍으로 되어있는 애들을 pair로 읽어들일 수 있는 기능이 있는 객체
inputstream으로 부터 읽어들일 수 있다.
두개쌍을 따로따로 읽어서 이 값이면 어떤 밸류를 가지고 있나 리턴해줌.
jpql
--------------
extends 뒤에 여러 개 오면 인터페이스간의 상속이구나!(원래 클래스간 상속은 단일 상속뿐)
생성자에서 멤버변수 초기화 많이 함.
생성자 호출될 때 멤버변수 초기화하는 게 좋다.
public class Shelf {
protected ArrayList<String> shelf;
public Shelf() {
shelf = new ArrayList();
}
}
'패스트캠퍼스 > Java Spring 웹 개발 마스터' 카테고리의 다른 글
ch 04. 자바의 유용한 클래스들 (0) | 2023.03.10 |
---|---|
ch 02. 객체지향 입문 메모 (0) | 2023.03.04 |
ch 01. 자바 기초 메모 (0) | 2023.02.27 |