꾸준히 하고싶은 개발자

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 4주차 본문

패스트캠퍼스 Java&spring

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 4주차

프라우스 2022. 6. 22. 16:28

상속은 is-A관계 와 HAS-A 관계로 구성되어있다.

상위 클래스에는 하위클래스보다 더 일반적이고 포괄한 개념 클래스에야 한다.

하위 클래스에는 상위클래스보다 더 구체적이고 자세한 기능의 개념이여야한다.

계층구조가 복잡하거나 계층이 높으면 좋지 않고 상위클래스을 수정을 많이 하면

하위클래스가 영향을 받아서 나중에  코딩할때에 오류가 날 가능성이 높다.

HAS- A 관계 

클래스가 다른 클래스 를 포함하고 변수로 선언 할수는 관계

코드는 재사용의 가장 일반적인 방법으로 쓰이고 상속하지 않는다.

 

다운 캐스팅 

업캐스팅 된 클래스가 다시 원래의 타입으로 변환되며 하위클래스로 형변환은 명시적과묵시적으로 해야한다.

코드 자체가 복잡해져서 가능하다면 다운 캐스팅을 안하는게 좋고 폴리모피즘(polymorphism)이용하는게 깔끔하게 코딩 할수있다.

 

다운캐스팅을 이용한 코드

 

 

다운캐스딩 결과

abstract Class (추상클레스)

구현할 코드없이도 함수의 선언만으로 추상 함수(abstract Method)를 포함한 클래스

메서드 선언과 정의

선언에는변환타입과함수이름 매개변수로 구성되며 정의에는 함수 구현과 같은 의미에 구현부를 가진다.

추상클래스(abstract)는 new 키워드 인스턴스클래스를 사용할수없다.

추상클래스  쓰는법

함수에 구현 코드가 없으면 추상클래스(abstract)를 선언한다.

모든 함수가 구현된 클래스라도 인스턴스화 할수 있지만 추상클래스(abstract)로 선언되면 인스턴스를 사용할수없다.

추상클래스(abstract)추상클래스의 추상 메서드는 하위 클래스가 상속 하여 구현되며

하위클래스 공용으로 사용하는 함수로 필요에 따라서 오버로딩을 해야하며 추상클래스 내의 구현된 함수다.

 

 

템플릿 함수 패턴

추상 함수나 구현 된 함수를 활용하여 코드에 흐름에따라 정의하는 함수다.

Final로 선언해서 하위 클래스에 재정의를 할수없게하며 프레임워크에서 많이 쓰며

추상클래스로 선언된 상위클래스에서 템플릿 메서드를 활용하여 전체적으로 흐름을 알고 정의해야

하위클래스가 다르게 구현되어야 하는 부분을 추상메서드로 선언하여 하위클래스에서 구현하도록한다.

 

인터페이스(interface)

모든 함수가 추상 메서드로  (public abstract)선언된다.

모든 변수는 상수로(public static final)로 선언된다. 

 

 

인터페이스 구현과 형변환 

인터페이스를 구현한 클래스는 인터페이스 형으로 선언한 변수로 형 변환이 가능하며 상속에서 형변환과 같다.

형변환 된 경우 인터페이스에 선언된 함수만 사용가능하다.

클래스 상속과 달리 구현 코드가 없으면 여러가지의 인터페이스를 구현할수있다.

인터페이스 쓰느법

Ex)사람과 티비를 연결해주는 연결점이다.(리모컨)

클래스나 프로그램이 제공하는 기능을 명시적으로 선언한다.

일종의 클라이언트 코드와 약속이며 클래스나 프로그램이 제공하는 계약서다.

어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는전제하에쓴다.

인터페이스를 구현한 다양한 객체를 사용한다.

 

인터페이스 의 여러가지 요소 

상수는 모든 변수로(public static final) 변환된다.

디폴트 함수 

구현을 가지는 메서드, 인터페이스를 구현하는 클래스들에서 공통으로 쓸수 있는 기본함수이며 구현하는 클래스에서 재정의를 할수있다.

 

정적함수

인스턴스 생성과 상관없이 인터페이스 타입으로 사용할 수있는 함수

 

private 함수

개인적인 함수로 인터페이스를 구현한 클래스에서 사용하거나 재정의 할수없다.

인터페이스내부에서만  사용하기위한 함수

default 함수나 static함수에서 사용한다.

여러 인터페이스 구현하고 간에 상속하기 

여러가지 인터페이스를 함번에 구현

자바의 인터페이스는 구현 코드가 없으므로 하나의 클래스가 여러 인터페이스는 구현할수있다.

기본 함수가 중복 되는 경우는 구현 하는 클래스에서 Overriding 해야한다.

여러 인터페이스를 구현한 클래스는 인터페이스 타입으로 형 변환 되는 경우 해당 인터페이스 선언된 함수내부에서만 사용가능함

 

인터페이스의 상속

extends의 키워트를 사용하며 인터페이스 간에 상속을 사용할수있으며  인터페이스는 다중상속이 가능하고 구현코드의 상속과 다르므로 타입상속이라고한다.

 

Object 클래스 모든 클래스에 최상위 클래스

java.lang Package안에 Objcet Class 가 있다.

프로그래밍시 import 하지않아도 자동으로 import된다

모든 클래스는 Object 클래스를 상속 받는다.

java.lang.Object. 클래스 

모든 클래스의 최상위 클래스는 최상위 클래스인 Object에서 상속받고  Object클래스의 메서드 중 일부는 재정의 해서 사용할수있다.

컴파일러가 extendsObject를 추가하며 Class Car => Class Car extends Object로 된다.

 

To String()함수

객체의 정보를 String으로 바꾸어서 사용할때 쓰이며 String, integer를 클래스는 이미 Overridng되어있다.

 

 

 

equals() 함수

두인스턴스의 주소값을 비교하기 위해서 ture,false로 변환

Overriding해서 두 인스턴스가 논리적으로 동일하면 Ture 구현하고

인스턴스가 다르더라도 논리적으로 동일한경우 진실(ture)를 변환하고 Overrding을 할수있다.

 

HashCode()함수

hashCode()는 인스턴스의 저장 주소를 반환되며 힙메모리에 인스턴스가 저장되는 방식이 Hash 방식이다.

Hash는 정보를 저장하고 자료구조를 검색하는 구조

자료의특정 값 (Key)값에 대한 저장 위치를 반환해주는 Hash 함수를 사용한다.

 

clone() 함수

객체의 원본을 복제하는데 사용하는 메서드

생성과정의 복잡한 과정을 반복하지 않고 복제 할 수있으며 생성자와 다르다.

clone()함수를 사용하면 객체의정보(인스턴스 멤버변수등등) 동일한 다른 인스턴스가 생성되는 것이여서 객체 지향 프로그램에서의

정보은닉 객체를 보호하기위한 관점에서 위배 될수 있으므로 주의하자

해당클래스의 clone() 함수의 사용을 허용한다라는 의미로 cloneable interface를 써준다.

 

String Class 

String Class를 쓰는방법 new 키워드를 쓰는방법 assign 쓰는방법이 있다.

힙메모리가 생성될때 마다 다른 주소값을 가지지만, constant pool의 문자열은 모두 같은 같은 주소 값을 가진다.

한번 생성된 String은 변하지 않는다.

String을 연결하면 기존의 String에 연결되는 것이 아닌 새로운 문자열이 생성된다,

메모리에 오버헤드 생겨서 잘 쓰지않는다.

String Builder, StringBuffer 활용

가변적인 char[]Buffer 안에 멤버 변수로 가진다.

문자열이 여러번 연결하거나 변경할때에 사용하면 유용하다.

StringBuffer 는 멀티 쓰레드 프로그래밍 에서 동기화을 보장하고 한개 쓰레드는 프로그램에서 String Builder 사용을 권장한다.

TO String () 함수로 String으로 반환된다.

text block

문자열안에 """ 로시작해서 """로 끝난다.

html .json문자열을 만드는데 유용하기 쓰임

 

 

 

ClassClass 

자바의 모든 클래스와 인터페이스는 컴파일 한 후 Class file이 생긴다.

Class 클래스는 컴파일 된 classfile을 로드해서 동적 로드 하고 정보를 호춣되는 함수가 제공된다

Class.forName(Class name) 함수로 클래스를 동적으로 로드한다.

 

동적로딩

컴파일시에 데이터 타입이 binding되는것이 아니라 실행중에 데이터타입을 binding하는방법

프로그래밍 시에는 문자열 변수로 처리 했다가 런 타임시에 원하는 클래스를 로딩하여 binding을 할수있다는장점이 있으나

컴파일 할때에 타입이 정해지지않으면 동적로딩 시 오류가나서 프로그램의 심각한 장애가 날수있다.

컴파일할때에 라이브러리나 클래스가 로컬에 없거나 대문자로 사용해야되는데 소문자를 사용하면 시스템이 다운된다.

reflection프로그래밍이란

Class클래스를 사용하여 클래스의 정보(생성자 변수 함수)등을 알수 있고 인스턴스를 생성하고 함수를 호출 하는 방식의 프로그래밍 방식이다.

로컬 메모리에 객체가 없는 경우 원격 프로그래밍 과 객체의 타입을 알 수없는 경우에 사용되며

Java.lang.reflect package안에 있는 클래스를 활용하여 프로그래밍한다.

일반적으로 자료형을 알고 있는 경우엔 사용되지 않는다.