배열
int[] cars = {1, 2, 3}; // 선언 생성 초기화를 한 번에
- 기본 타입 배열: 배열 요소가 실제 값을 저장함
- 참조 타입 배열: 배열 요소가 객체의 주소(참조값)를 저장함
참조 타입 배열의 동작 원리
- 배열은 힙 영역에 객체로 생성됨.
- 배열 변수는 참조값(주소)을 스택 메모리에 저장.
- 요소가 기본 타입이면 값이 저장되고, 참조 타입이면 객체의 주소 저장됨.
배열 자체는 크기가 불변
String도 불변 (문자 배열 기반이므로 변경 불가)
상속
class A{
int i = 10;
public void printI(){
System.out.println(i);
}
}
class B extends A{ // B는 A를 상속받아 A의 필드와 메소드를 가짐
int j = 100;
public void printJ(){
System.out.println(j);
}
}
B b = new B();
b.printI(); // 호출 가능
b.printJ(); // 호출 가능
A b = new B();
b.printI(); // 호출 가능
b.printJ(); // 호출 불가 b는 A타입이므로 A에 정의된 멤버만 사용 가능
shadow effect
자식 클래스에서 부모 클래스의 멤버(변수 또는 메서드)를 동일한 이름으로 다시 선언할 때 발생
다형성을 활용한 확장성 높은 설계
public class Printer {
public void print(Object o) {
if(o instanceof Circle) { //조건, 타입체킹
Circle c = (Circle)o; // 타입 캐스팅
c.areaCircle();
}
}
}
기존의 Printer 클래스는 Object 타입을 사용하여 다양한 객체를 처리할 수 있지만, 타입 체크와 캐스팅이 필요해 성능이 낮고 유지보수가 어려움.
- instanceof를 사용하여 타입을 체크해야 함 → 새로운 도형이 추가될 때마다 수정 필요
- 캐스팅이 필요하므로 성능 저하
- 확장성이 낮음 ==> Rectangle, Triangle이 추가되면 if 문이 계속 늘어남
Shape 인터페이스를 만들고, Circle, Rectangle, Triangle이 이를 구현하도록 변경
public interface Shape {
void print(); // 각 도형마다 다른 방식으로 출력
}
확장성은 높지만 성능은 낮음.
Object도 새로운 타입으로 바꿔야함. Shape.java로
이렇게 해도 o는 아직 섀도우 이펙트때문에 오브젝트이긴 함
이걸 해결하기 위한 것이 다형성
다형성
1. polymorphic variable(다형적 변수) : 슈퍼 타입으로 선언된 변수
2. overriding(재정의) : 슈퍼(부모)의 메서드가 자식 클래스에서 내용을 변경하여 정의하는 것 ==> 확장성, 성능, 정합성 향상
super : public void area () {xxx}
^|| || || ||
sub : public void area () {yyy}
@Override 어노테이션 - 의미 있게 처리해달라고 하는 주석
오버라이딩한 클래스의 메소드는 shadow effect에 안걸림
오버라이딩한 자식 클래스에 있고, 부모 클래스에 없는 메소드는 shadow effect에 걸리지만, 정합성 감소하기 때문에 선언하지 않는 것이 좋음
public class Printer {
public void print(Shape o) {
o.area();
}
}
3. overloading : 한 클래스 내에서 같은 이름의 메서드가 다수 존재하는 것
규칙) 메소드 이름은 같고, 파라미터 리스트 반드시 달라야 함.
abstract
메서드에 구현 블럭{}을 떼면 abstract로 선언
메서드에 abstract가 있으면 클래스에도 abstract
Modifier
1) Access Modifier
private < (default) < protected < public
class : public, (default)
method, dta : 4가지 중 하나
2) Usage Modifier (사용 지정자)
i) static : 객체 생성 없이 사용하라
class : inner class에만 선언
data : 공유하는 데이터
ii) abstract - 상속으로만 사용하라 (객체 생성 불가)
interface
다중 상속을 위한 프로그램 단위. 단일 상속은 클래스
more OOP =>> 확장성 증가, 정합성 증가