Class
Class의 구조
class Person {
//속성
String name;
//생성자
//기본 생성자 Person ();
//기능
void callName() {
System.out.println(name);
}
getter/setter
- getter: 클래스의 속성을 가져오는 기능
- setter: 객체 외부에서 속성을 설정할 수 있게 하는 기능
JVM 메모리 영역
- JVM 메모리 영역은 크게 method(static), stack, heap 으로 구분 됨
Method(Static)
- 프로그램 실행 시 작성했던 모든 .java의 데이터가 이 영역에 저장됨
- static 키워드로 선언된 변수와 method들이 여기 위치함.
- 여기 저장된 데이터는 공용으로 사용 가능
Stack
- Method가 호출될 때마다 Stack에 메모리가 할당 됨
- 하나의 스택 프레임에 하나의 method의 지역변수가 저장됨
- 후입선출(LIFO) 구조
- method 실행 시 추가되고 종료 시 자동으로 제거됨
Heap
- new 키워드로 생성된 개체가 저장되는 곳
- stack 영역의 변수는 heap영역의 객체의 메모리 주소값을 참조함.
객체지향
캡슐화
- 객체의 정보를 외부에서 직접 접근하지 못하게 보호하는 것
- 접근 제어자를 통해서 접근 범위를 제한할 수 있음
- public(어디서든 접근가능)/private(같은 클래스내부에서만 접근가능) 등이 있음
- private로 선언된 데이터는 getter와 setter 메서드 를 통해 접근할 수 있음.
- 속성이 많아질 수록 관리가 어려워지므로 의미있는 단위로 묶어 관리하는 것이 좋음
상속
- 클래스 간의 관계를 상위-하위의 개념으로 바라봄.
- 상속은 재사용과 확장이 가능함.
- extends 키워드를 사용해서 상속관계를 구현함.
추상클래스
- 객체의 설계도 역할에 적합한 클래스
- abstract 키워드로 선언함.
- 부모객체에서 abstract로 선언한 메서드는 자식 메서드에서 강제로 구현해야함.
- 추상 클래스는 객체를 생성할 수 없음.
- 인터페이스와의 차이점 :
1. 인스턴스 변수를 선언할 수 있음.
2. 상속은 계층적 구조를 인터페이스는 펴준을 제공하는데 적합함.
=> 계층적 구조를 표현하면서 공통 속성과 기능을 재사용할 때 추상클래스를 사용하는 것이 적합함.
추상화
- 불필요한 정보를 제거하고 본질적인 특징만 남기는 것
- 추상화의 계층적 특징을 활용해 유지보수성을 높일 수 있음
다형성
다운캐스팅 시 주의점
- 컴파일러는 다운캐스팅이 "문법적"으로 올바른지만 확인하므로 다운캐스팅을 할 때 ClassCastException오류가 발생할 수 있음.
- instanceof를 활용하여 타입을 확인 후 형변환을 하는 것이 안전함.
람다
- 익명 클래스를 더 간결하게 표현하는 문법
- 함수형 인터페이스를 통해서 구현하는 것을 권장
//함수형 인터페이스
@FunctionalInterface
public interface Calculator {
int sum(int a, int b); // 하나의 추상 메서드만 선언
}
//ex)람다 표현식
Calculator calculator1 = (a,b) -> a + b;
//ex)익명 클래스
Calculator calculator1 = new Calculator() {
@override
public int sum(int a, int b){
return a + b;
}
};