클래스와 객체, 인스턴스
클래스
- 객체(object)를 만들어내기 위한 틀
- 만들어 낼 객체의 속성과 메서드의 집합을 담아놓은 것
객체
- 클래스로부터 만들어지는 실체
- 클래스로 선언된 변수
인스턴스
- 객체가 메모리에 할당이 된 상태
- 런타임에 구동되는 객체를 의미 (객체와 같은 의미로 쓰이기도 함)
Person a = new Person(); <em>// 객체 -> 인스턴스</em>
Person b;<em>//객체</em>
b = new Person();<em>//인스턴스</em>
static 키워드
- 장점 : 중복 제거
- 단점 : 선언을 하자마자 메모리에 올라간다. → 메모리 낭비가 될 수 있다.
- Java
- static으로 선언하지 않은 변수 → heap 영역에 할당
- GC가 메모리 관리 (회수)
- static 선언 변수 : heap이 아닌 MethodArea 영역에 할당 → 종료 전까지 회수가 안된다.
오버로딩과 오버라이딩
오버로딩
- 이름이 같아도 매개변수 개수, 타입, 순서를 다르게 해서 같은 이름으로도 여러 개의 함수를 정의 할 수 있는 것
- 프로그램의 유연성을 높이고 결과적으로 코드를 깔끔하게 하는 효과가 있으며 같은 클래스 내에서 사용
class Calculator {
void multiply(int a, int b) {
System.out.print("결과는 : " + (a * b) + "입니다.");
}
void multiply(int a, int b, int c) {
System.out.print("결과는 : " + (a * b * c) + "입니다.");
}
void multiply(double a, double b) {
System.out.print("결과는 : " + (a * b) + "입니다.");
}
}
오버라이딩
- 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의하는 것
- 상속 관계 클래스에서 사용되며 static, final로 선언한 메서드는 오버라이딩이 불가능
interface Animal {
void eat();
}
class Person implements Animal {
@Override
void eat() {
System.out.println("먹는다.");
}
}
추상화
- 복잡한 데이터, 구조, 시스템 등으로부터 핵심만을 가려내 덜 자세하게 만드는 것
- 세부사항, 절차 등을 감추고 인터페이스 등을 만드는 것으로 복잡도를 낮추는 방법
데이터 추상화
- 어떠한 데이터들의 공통점만을 모으고 차이점은 버린다.
- 예를 들어 고양이, 강아지, 원숭이 등의 객체들을 공통적인 특징들을 묶어 동물이라는 카테고리로 카테고리화 시킨다.
프로세스 추상화
- 어떠한 내부 프로세스를 숨기는 것을 의미
- 예를 들어 데이터베이스가 어떻게 데이터를 저장하는지는 모르지만 단순하게 insert, upsert 등의 쿼리로 데이터를 저장할 수 있다.