TIL 12/1

드립이 블로그·2022년 12월 1일
0

TIL

목록 보기
22/80

12월의 시작이다.
올해가 마무리 되어간다는 느낌이 들게된다.
내 공부는 아직 시작도 안했는데 올해가 끝나가는게 너무 슬프다.
올해가 끝나기 전에 무언가 할 수 있는게 생기려나?


Interface

자식 클래스가 여러 부모 클래스를 상속 받는 것을 다중 상속이라고 한다.
이는 다양한 동작을 수행 할 수 있게 되는 장점을 가진다.
하지만 클래스를 이용해 다중상속 할 경우 메소드의 출처가 모호해지는 등의 문제를 야기하기 때문에 자바는 클래스를 통한 다중 상속을 지원하지 않는다.
클래스를 통한 다중 상속을 지원하지 않기 때문에 자바는 인터페이스를 통해 다중상속을 지원한다.

인터페이스는 다른 클래스를 작성할 때, 기본 틀을 제공하며 다른 클래스 사이의 중간 매개 역할을 담당하는 일종의 추상 클래스를 의미한다.

자바에서 추상클래스는 추상 메소드 뿐 아니라, 생성자, 필드, 일반 메소드도 포함이 될 수 있다.
하지만 인터페이스는 오직 추상메소드와 상수만을 포함할 수 있다.

인터페이스 선언

인터페이스 선언 방법은 클래스 작성 방법과 동일하다.
인터페이스 선언 시, 접근 제어자와 함께 인터페이스 키워드를 사용하면 된다.

접근제어자 interface 인터페이스명 {
public static final 타입 상수이름 = 값;
pubilc abstract 메소드명;
}

인터페이스는 클래스와는 다르게 모든 필드가 public static final이다.
또한 모든 메소드는 public abstact이다.
이 부분은 모든 인터페이스에서 공통 적용되므로 생략 가능하다.
생략시 자바 컴파일러가 자동으로 추가해준다.

인터페이스는 자신이 직접 인스턴스를 생성할 수 없다.
인터페이스는 포함하고 있는 추상 메소드를 구현할 클래스를 작성해야 한다.

자바에서 인터페이스는
calss 클래스명 implemets 인터페이스명{}
과 같이 구현한다.
모든 추상메소드를 구현하지 않는다면, abstract 키워드를 사용하여 추상 클래스로 선언해야 한다.

Promotion

자동형변환이라한다.
작은 자료형에서 큰 자료형으로 이동 할 때,
자동으로 형변환이 일어난다.
int long float double 순으로 큰 자료형이다.

Promotion과는 반대로 큰 자료형에서 더 작은 자료형으로 이동할 때에는, Casting이 필요하다.

Casting

강제형변환이다.
이는 큰 자료형에서 작은 자료형으로 변환이 필요할 때 사용한다.

int a = A;
byte b = a;

라고 했을때, 큰 자료형에서 작은 자료형으로 이동하게 될 때, 오류가 생긴다.
이를 오류가 생기지 않게 강제적으로 형변환 해주는 것을 Casting이라고 한다.

int a = A;
byte b = (byte)a;

와 같은 형식으로 오류 발생을 피하게 된다.
다만, 자료형의 범위를 벗어나게 되면, 값이 음수가 나오는 등 이상하게 변할 수 있다.

Object

java.lang 패키지 중에 가장 많이 사용되는 클래스이다.
Object클래스는 모든 자바 클래스의 최고 조상클래스이다.
따라서 모든 클래스는 Object클래스의 모든 메소드를 바로 사용 가능하다.
Objcet 클래스는 필드를 가지지 않는다.
Objcet 클래스는 총 11개의 메소드로 구성되어있다.

구성요소

toString() 메소드

해당 인스턴스에 대 정보를 문자열로 반환
이때 반환되는 문자열은 클래스 이름과 함께 구분자로 @가 사용된다.
그 뒤 16진수의 해시코드가 추가된다.
16진수 해시코드 값은 인스턴스의 주소를 가리키는 값이기 때문에 인스턴스마다 모두 다르게 반환된다.

equals() 메소드

해당 인스턴스를 매개변수로 전달받는 참조 변수와 비교하여 그 결과를 반환
참조 변수가 가리키는 값을 비교하기 때문에 두 객체는 false를 반환함.

clone() 메소드

해당 인스턴스를 복제하여 새로운 인스턴스를 생성해 반환한다.
필드 값만을 복사하기 때문에 필드의 값이 배열이나 인스턴스면 제대로 복사 할 수 없다.
이러한 경우에는 해당 클래스에서 clone 메소드를 오버라이딩 하여 재정의 해야 한다.

이 외에도
finalize()
getClass()
int hashCode()
notify()
notifyAll()
wait()
wait(iong timeout)
wait(iong timeout, int nanos)
가 있다.

Dispatch

어떤 메소드를 호출 할 것인가를 결정하는 과정을 말한다.
자바는 런타임 시 객체를 생성하고 컴파일 시 생성할 객체 타입에 대한 정보만 보유한다.
정적 디스패치와 동적 디스패치로 나뉜다.

Static Dispatch

정적 디스패치
컴파일 시점에서 컴파일러가 특정 메소드를 호출 할 것을 알고 있는 경우 사용한다.
컴파일 시 생성된 bytecode에 이 정보가 그대로 남아있다.
함수를 오버로딩하여 사용하는 경우 인자의 타입이나 리턴 타입 등에 따라 어떤 메소드를 호출 할 지 알 수 있는 경우 사용한다.

Dynamic Dispatch

동적 디스패치
인터페이스나 추상 클래스에 정의된 추상 메소드를 호출하는 경우이다.
인터페이스 또는 추상 클래스로 선언하고 상속 받은 하위 클래스의 인스턴스를 생성한다.
컴파일러가 알고있는 타입에 대한 정보를 토대로 런타임 시 해당 타입의 객체를 생성하고 메소드를 호출한다.

익명객체

이름이 없는 객체이다. 무명클래스 라고 하기도 한다.
프로그램에서 일시적으로 한번만 사용되고 버려지는 객체이다.
재사용이 되지 않고, 확장성이 좋지 않다.
이를 사용하는 이유는 프로그램 내에서 일시적으로 한번만 사용 되어야 하는 객체이거나, 확장성을 활용하는 것이 유지/보수에 더 불리할 경우 사용된다.

구현 방법은 2가지로 나뉜다.

익명 자식 객체

부모 클래스를 상속해서 자식 객체를 생성해 변수에 담는 것이다.
익명 자식 객체는 생성자 선언이 불가능하다.
익명 자식 객체에 새로 정의된 필드와 메소드는 익명 자식 객체 내부에서만 사용되고, 외부에서는 필드와 메소드에 접근 할 수 없다.

익명 구현 객체

인터페이스 타입에 맞게 필드와 변수를 선언 후 구현 객체를 초기 값으로 대입한다.
new 연산자를 이용해 구현 객체를 생성한다.
이렇게 생성된 객체를 필드나 로컬 변수에 대입한다.

Method References

메소드 레퍼런스
람다식과 함께 사용된다.
람다 표현식이 단 하나의 메소드만 호출하는 경우 해당 람다 표현식에서 불필요한 매개 변수를 제거하고 사용 가능하게 한다.

클래스 이름::메소드 이름
참조변수 이름:: 메소드 이름

등 기호 :: 를 사용한다.
메소드 레퍼런스는 사용 패턴에 따라 나뉜다.

Static Method References
Static method를 메소드 레퍼런스로 사용하는 것을 말한다.

Instance Method References
객체의 멤버 메소드를 메소드 레퍼런스로 사용하는 것이다.

Constructor Method References
Constructor를 생성해주는 코드이다.

Immutable Object

불변객체
생성 후 상태를 바꿀 수 없는 객체이다.
객체 전체가 불변인 경우도 있고, 일부 속성만 불변인 경우도 있다.
경우에 따라서는 내부에서 사용하는 속성이 변화해도 외부에서 그 객체의 상태가 변하지 않는 것으로 보인다면 부변 객체로 보기도 한다.
불변객체의 초기 상태는 보통 생성 시에 결정된다.
객체가 실제로 사용되는 순간 까지 늦춰지기도 한다.
복제나 비교를 위한 조작을 단순화 할 수 있다.
String, Integer, Boolean 등이 있다.

객체의 신뢰도가 높아진다.
멀티스레드 환경에서 동기화 처리 없이 객체 공유가 가능해진다.

객체가 가지는 값마다 새로운 객체가 필요해지므로 메모리 누수, 성능 저하를 야기할 수 있다.

기본적으로 final 을 사용하고 Setter를 구현하지 않는 것으로 불변객체를 만든다.

Mutable Object

가변객체
클래스의 인스턴스가 생성된 이후 내부 상태가 변경 가능한 객체이다.
멀티스레드 환경에서 사용하기 위해 별도의 동기화 처리가 필요하다.
대표적 가변 객체는
ArrayList, HashMap, StringBuilder, StringBuffer 등이 있다.
커스텀 객체를 생성해 내부 상태를 변경 할 수 있게 만든다면 그도 가변객체가 된다.

Optional

Optional<T> 클래스를 사용해 NPE를 방지 할 수 있다.
Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper 클래스이다.
이는 잘못 사용시 시스템 성능의 저하를 야기하므로 메소드 결과가 null이 될 수 있고, 그에 의해 오류 발생 가능성이 높을 때 사용하는 것이 좋다.

NPE Null Pointer Exception
선언 후 아무것도 참조 하지 않은 null 상태의 변수에서 내용을 참조 할때 발생하는 오류이다.


Stream에 대해서도 알아보려 했으나, 봐도 이해가 안된다.
보통 다른 것들은 그래도 보다 보면 어느정도 이해가 가는데, Stream은 어떻게 써야 하는지 사용 방법은 알겠는데, 개념이 이해가 안된다고 해야하나?
반복문 대신 사용하는 것이니까, 반복문에 대해 어느정도 확신이 생기면 그때 공부하는 것이 좋을 것 같다.

0개의 댓글