면접 준비 용 자바 개념 정리 2
2018-09-21
1. 객체 지향 프로그래밍 특징
- 객체 지향 프로그래밍의 특징으로는 캡슐화, 상속, 다형성을 들 수 있다.
1-1. 캡슐화
- 캡슐화란 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.
- 자바 언어는 캡슐화 된 멤버를 노출시킬 것인지 숨길 것인지 결정하기 위해 접근 제한자(Access Modifier)를 사용한다. 접근 제한자는 객체의 필드와 메소드의 사용 범위를 제한함으로써 외부로부터 보호한다.
1-2. 상속
- 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해준다.
1-3. 다형성
- 다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 코드 측면에서 보면 다형성은 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
- 자바는 다형성을 위해 부모 클래스 또는 인터페이스의 타입 변환을 허용한다. 부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현 객체가 대입될 수 있다.
- 부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다. 그러나 예외가 있는데, 메소드가 자식 클래스에서 오버라이딩 되었다면 자식 클래스의 메소드가 대신 호출된다.
2. 강제 타입 변환(Casting)
- 강제 타입 변환(casting)은 부모 타입을 자식 타입으로 변환하는 것을 말한다. 물론 모든 부모 타입을 자식 클래스 타입으로 강제 변환할 수 있는 것은 아니고, 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다
- 자식 타입이 부모 타입으로 자동 변환되면 부모 타입에 선언된 필드와 메소드만 사용 가능하다는 제약 사항이 따른다. 만약 자식 타입에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환한 다음 자식 타입의 필드와 메소드를 사용하면 된다.
class Parant{
String field1;
void method1(){ ... }
void method2(){ ... }
}
class Child extends Parent{
String field2;
void method3(){ ... }
}
class Example {
public static void main(Sring[] args) {
Parent parent = new Child();
parent.field1 = "abc";
parent.method1();
parent.method2();
parent.field2 = "def"; // (불가능)
parent.method3(); // (불가능)
Child child = (Child) parent;
child.field2 = "def";
child.method3();
}
}
2-1. 객체 타입 확인(instanceof)
- 어떤 객체가 어떤 클래스의 인스턴스인지 확인하려면 instanceof 연산자를 사용할 수 있다
- 강제 타입 변환이 필요한 경우 반드시 매개값이 어떤 객체인지 instanceof 연산자로 확인하고 안전하게 강제 타입 변환을 해야한다
- 타입을 확인하지 않고 강제 타입 변환을 시도하면 ClassCastException 예외가 발생 할 수 있다.
public void method(Parent parent){
if(parent instanceof Child){
Child child = (Child) parent;
}
}
3. static
- ‘정적인, 고정인, 움직이지 않는’의 의미를 가진다. JVM 메모리에 고정됨을 뜻함과 동시에 모든 객체가 ‘공유’한다는 의미를 뜻한다.
- 때에 따라 모든 인스턴스가 같은 값을 공유하고 싶을 때가 있는데 이런 경우 static 키워드를 멤버변수 앞에 붙이면 클래스 소속의 변수가 된다. 물론 메소드도 마찬가지이다.
- static이 실행되는 시점은 클래스가 메모리 상에 올라갈 때 이며, static이 붙은 변수를 클래스 변수라고 하는 것은 변수가 존재하는 영역이 클래스가 존재하는 영역과 같기 때문이다.
3-1. 싱글톤
- 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우 사용
- 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.
- 생성자를 외부에서 호출할 수 없도록 하려면 생성자 앞에 private 접근 제한자를 붙여주면 된다
- 대신 외부에서 호출할 수 있는 정적 메소드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다
public 클래스(){
// 정적 필드
private static 클래스 singleton = new 클래스();
// 생성자
private 생성자();
// 정적 메소드
public static 클래스 getInstance(){
return singleton;
}
}
4. final
- final이란 의미는 최종적이라는 뜻을 가지고 있다.
- final 필드는 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다는 의미이다.
- 상속할 수 없는 final 클래스: 클래스를 선언할 때 final 키워드를 class 앞에 붙이게 되면 이 클래스는 최종적인 클래스이므로 상속할 수 없는 클래스가 된다. final 클래스의 대표적인 예는 자바 표준 API에서 제공하는 String 클래스이다.
- 오버라이딩 할 수 없는 final 메소드: 메소드를 선언할 때 final 키워드를 붙이게 되면 이 메소드는 최종적인 메서드이므로 오버라이딩을 할 수 없는 메소드가 된다.
4-1. 상수(static final)
- static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다. 그리고 한번 초기값이 저장되면 변경할 수 없다.
5. 접근 제한자
접근제한자 | 적용 대상 | 접근할 수 없는 클래스 |
---|---|---|
public | 클래스,필드,생성자,메소드 | 없음 |
protected | 필드,생성자,메소드 | 자식 클래스가 아닌 다른 패키지에 소속된 클래스 |
default | 클래스,필드,생성자,메소드 | 다른 패키지에 소속된 클래스 |
private | 필드,생성자,메소드 | 모든 외부 클래스 |