본문 바로가기
Study with me/TECH!T back-end shcool 7

week_02 JAVA 2/?

by 외계나무 2023. 10. 23.

static

static으로 선언된 클래스 필드는 해당 클래스의 객체에서 값 할당이 가능 하지만,
각 객체의 값이 아니기 때문에 해당 클래스 필드의 값이 할당되는 것.

Class Person(){  
    static int 나이;  
    int 번호;  
}  

Person a = new Person();

Person.나이 = 19;  // O  
a.나이 = 20;  // O -> 클래스의 static 필드값(static 변수)은 각 객체에서 할당(변경) 가능하지만,  

Person.번호 = 99;  // X  -> 객체에 속한 필드값(instance 변수)은 클래스 차원에서 할당(변경)할 수 없다  
a.번호 = 89;  // O

1. static, 왜 사용할까?

  • 객체화가 필요 없다.
  • 메모리가 절약된다.

= 각 객체마다 있을 필요는 없는 값을 static으로 선언하여 메모리를 절약하고 필요할 때마다 객체화할 필요가 없게 하는 것.

2. static vs final vs static final

  • static: 객체 생성 없이 사용할 수 있는 필드와 메서드 생성 용도
    : 한 클래스 내 모든 객체가 사용하는 공용 데이터라든지, 인스턴스(객체) 별로 차이가 없어도 되는 메서드를 생성할 때 사용한다.
    static 메서드는 객체를 생성하여 사용할 필요가 없기 때문에 (= 객체 참조 불필요한 정적 메서드) 인스턴스 메서드/필드를 사용할 수 없고, this 키워드(인스턴스 자신을 가리키는 참조 변수)도 사용 불가하다.
  • final: 변경 불가 값(상수) 생성 용도 (클래스/객체 단위)
    : 클래스에 final로 선언 및 초기화 (= 생성) 하면 그 값으로 고정되고, 클래스에는 final로 선언만 해두고 각 인스턴스에서 값을 할당하면 해당 인스턴스 별로 각자의 값이 고정된다. 바꾸지 않을 값을 할당할 때 사용한다.
  • static final: static + final (클래스 단위 상수 생성)
    : 둘을 합한 것으로, 클래스에서 모든 객체가 공유할 + 객체 별로 절대 변경되지 않아야 하는 값을 생성하여 사용한다.

참고: https://gobae.tistory.com/3


상속

1. 상속이란?

한 종류로 묶이는 여러 클래스를 만들 때, 중복되는 메서드/필드 생성을 방지하기 위해 해당 종류의 클래스를 따로 만들고 각 클래스는 이를 상속받아서 해당 메서드와 필드를 사용한다. (메서드의 경우 재정의override(동일 시그니처, 다른 수행), 필드의 경우 동명의 필드를 만들어 부모 클래스의 필드를 은닉화하기도 함) (코드 재사용과 객체 계층화에 유용)

2. 상속의 단점

java는 다중 상속이 불가능하여, 한 클래스는 여러 클래스를 상속받을 수 없고, 손자클래스는 부모클래스와 조부모클래스의 메서드를 동시에 상속받아 사용할 수 없다.

  • 강한 결합 (Tight Coupling): 상속은 부모 클래스와 자식 클래스 간에 강한 종속성을 만들어, 코드의 유연성과 재사용성을 저하시킬 수 있다.
  • 제한된 확장성 (Limited Extensibility): 클래스당 하나의 부모 클래스만 상속받을 수 있기 때문에 (다중 상속 불가, 단일 상속 지원), 여러 클래스의 기능을 복합적으로 상속받거나 추가적으로 기능을 확장하기 어렵다.
  • 메서드 오버라이딩으로 인한 혼란: 자식 클래스에서 부모 클래스의 메서드를 오버라이딩할 경우, 동일한 시그니처를 가진 메서드가 존재하게 됩니다. 이로 인해 프로그래머가 의도하지 않은 동작 혼란을 야기할 수 있으며, 코드를 이해하기 어렵게 만들 수도 있습니다.
  • 보안 위협: 부모 클래스에서 정의된 모든 속성과 메서드가 자식 클래스로 전달되므로, 필요하지 않은 정보까지 노출될 가능성이 있다.

3. 추상클래스 상속

부모클래스 객체 = new 자식클래스();
→ 해당 객체는 자식클래스가 부모클래스로 자동형변환 되어 참조되는 셈.
→ 근데 이런 상황에서 부모클래스의 직접적인 객체는 불필요한 경우 많음.
→ 그래서 이 부모클래스는 추상클래스로 선언함. (abstract class)
(추상 클래스 내의 필드와 메서드 또한 추상으로 선언해야 함)

'Study with me > TECH!T back-end shcool 7' 카테고리의 다른 글

week_02 JAVA 4/?  (0) 2023.10.25
week_02 JAVA 3/?  (1) 2023.10.24
week_01 JAVA 1/?  (0) 2023.10.20
WIKI  (0) 2023.10.20
week_01 GIT 2/2  (1) 2023.10.19