[TWIL] 2020-01-17 (금)
17 Jan 2020 | Java자바에서 사용되는 변수
자바의 정석을 보면 변수의 선언 위치에 따라 클래스 변수, 인스턴스 변수, 지역 변수의 세 가지 종류가 있다고 설명한다.(p.246)
- 클래스변수는 클래스가 메모리에 올라갔을 때 생성된다.
- 인스턴스변수는 인스턴스가 생성되었을 때 생성된다.
- 지역변수는 변수 선언문이 수행되었을 때 생성된다.
이외에 멤버 변수는 빈(Bean) 클래스에서 해당 클래스의 속성을 정의하는 변수를 의미한다. 또한 참조변수는 참조 타입을 가져 값이 아닌 주소를 가리키는 변수를 의미한다.
final 제어자(modifier)
final은 클래스, 메서드, 멤버변수, 지역변수 에 사용될 수 있다.
- final 클래스: 변경되거나 확장될 수 없는 클래스를 의미한다. 따라서 final 클래스는 상속이 불가능하다.
- final 메서드: 변경될 수 없는 메소드를 의미한다. 오버라이딩이 불가하다.
- final 멤버변수, 지역변수: 값을 변경할 수 없는 상수가 된다.
static 제어자(modifier)
static은 멤버변수, 메서드, 초기화 블럭 에 사용될 수 있다.
- static 멤버변수: 클래스가 메모리에 로드될 때 단 한 번만 수행되어 생성된다. 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 되며 클래스 변수는 인스턴스를 생성하지 않고도 사용이 가능하다.
- static 메서드: 인스턴스를 생성하지 않고도 호출이 가능하며, static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.(static 메소드에서는 static 멤버변수나 메소드만 호출이 가능하다)
생성자(constructor)
생성자는 객체의 데이터를 초기화하는 방법을 제공해주는 메서드이다. 객체의 멤버 변수에 값을 지정해준다는 점에서 setter와 비슷하지만, 생성자는 인스턴스 생성과 동시에 필드값을 초기화하고 setter 메소드는 인스턴스 생성 후 필드값을 넣어준다. 생성자의 이름은 반드시 클래스 이름과 같아야 한다.
생성자는 JVM이 자동 호출해주며, 사용자가 직접 호출 순서를 제어할 수도 있다. 클래스 내부에 생성자가 하나도 없으면 내부적으로 자동으로 기본생성자(default constructor)가 생성된다. 이 떄 주의할 점은 컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 ‘클래스 내에 생성자가 하나도 없을 때’뿐 이라는 것이다.
class B extends A {
//위의 의미는 아래의 코드를 내포하고 있음
B() { A(); }
}
위의 구조에서 B객체를 생성하면 어떻게 될까? 부모 클래스인 A의 멤버를 먼저 메모리에 올린 뒤, B의 멤버를 메모리에 올린다. 그래서 A의 멤버는 가려지게 됨.
- 추상 메서드 (부모 메서드의 이름만 정의된 메서드를 의미함)의 목적?
- 상속의 필요성
- 코드의 중복을 줄임
- 프로젝트 내의 클래스 구조를 효율적으로 관리할 수 있음
- 코딩의 일관성
더 찾아볼 것
- 컴파일러는 왜 기본 생성자를 자동으로 생성해줄까? 기본생성자(default constructor)의 의미와 필요성
- Bean 클래스의 정의 => 필요한 데이터를 저장할 멤버 변수들과 게터와 세터 함수만 존재하는 클래스?
- getter & setter의 정의 => 다른 클래스에서 접근할 때 사용되는 함수?
- 자바의 클래스는 확장 개념이 아닌 상속 개념이라고 한다.(그럼 확장 개념을 가진 언어는 뭐가 있을까? 객체지향 언어가 아닌걸까?)
- 상속이 필요한 이유?
- 상속의 단점?(이펙티브 자바 아이템 18, 19)
- 인터페이스에서 상수만 사용가능한 이유는 무엇인가? -> 통일성을 위해서…???
- 그냥 추상클래스를 다중상속 가능하게 하면 되는데 굳이 추상클래스와 인터페이스의 용도를 나눈 이유는 무엇인가? 각각의 필요성이 뭘까?(정의(definition) 말고 필요한 이유..!)
- 객체지향프로그래밍이란?
- SOLID
- 다형성
- 상속
- 추상화
- 정보은닉