참조변수 super
-객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
-부모의 멤버를 자신의 멤버와 구별할 때 사용
class Ex7_2 {
public static void main(String args[]) {
Child c = new Child();
c.method();
}
}
class Parent { int x = 10; /* super.x */ }
class Child extends Parent {
int x = 20;
void method() {
System.out.println("x=" + x); // 가까운 쪽 그러니 child의 안에 있는 것을 호출
System.out.println("this.x=" + this.x);
// 만약 child 내에서 x가 선언되지 않으면 위 x 와 this.x 모두 10이 출력
System.out.println("super.x=" + super.x);
}
}
// x=20
// this.x=20
// super.x=10
super() - 부모의 생성자
-부모의 생성자를 호출할 때 사용
-부모의 멤버는 부모의 생성자를 호출해서 초기화
-생성자의 첫 줄에 반드시 생성자를 호출해야 한다. 그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입
제어자(modifier)
-클래스, 변수, 메서드의 선언부에 사용되어 부가적인 의미를 부여
-제어자는 크게 접근 제어자와 그 외의 제어자로 나뉜다.
-하나에 대상에 여러 개의 제어자를 조합해서 사용할 수 있으나, 접근제어자는 단 하나만 사용할 수 있다.
접근 제어자 : public, protected, default, private
그 외 : static, final, abstranct, native, transient, synchronized, volatile, strictfp
static
접근 구역 : 멤버변수, 메서드, 초기화 블럭
멤버변수
-모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다
-클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
-클래스가 메모리에 로드될 때 생성된다.
메서드
-인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
-static 메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
final
접근 구역 : 클래스, 메서드, 맴버변수, 지역변수
클래스 - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 부모가 될 수 없다.
메서드 - 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
맴버변수, 지역변수 - 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
-final이 붙은 변수는 상수이므로 보통은 선언과 초기화를 동시에 하지만, 인스턴스마다 고정값을 갖는 인스턴스 변수의 경우 생성자에서 초기화한다.
abstract
접근 구역 : 클래스, 메서드
클래스 - 클래스 내에 추상메서드가 선언되어 있음을 의미한다.
메서드 - 선언부만 작성하고 구현부는 작성하지 않은 추상메서드임을 알린다.
접근 제어자(access modifier)
접근 구역 : 클래스, 멤버변수, 메서드, 생성자
private - 같은 클래스 내에서만 접근 가능
default - 같은 패키지 내에서만 접근 가능
protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근 가능
public - 접근 제한이 전혀 없다.
사용이유
-외부로부터 데이터를 보호하기 위해서
-외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
제어자 조합
| 대 상 | 사용가능한 제어자 |
| 클래스 | public, default, final, abstract |
| 메서드 | 모든 제어 접근자, final, abstract, static |
| 맴버변수 | 모든 제어 접근자, final, static |
| 지역변수 | final |
1. 메서드에 static과 abstract를 함께 사용할 수 없다.
-static메서드는 구현부에 있는 메서드에만 사용할 수 있기 때문
2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
-클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미고, abstract는 상속을 통해서 완성되어야 한다는 의미로 서로 모순되기 때문
3. abstract메서드의 접근제어자가 private일 수 없다.
-abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손클래스에서 접근할 수 없기 때문
4. 메서드에 private와 final을 같이 사용할 필요는 없다.
-접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문에 이 둘 중 하나만 사용해도 의미가 충분
다형성(polymorphism)
-여러 가지 형태를 가질 수 있는 능력
-하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것
즉, 부모타입의 참조변수로 자손타입의 객체를 다룰 수 있는 것
Tv t = new SmartTv();
//타입이 불일치하는 것을 다루는 것
반대로 자손타입의 참조변수로 부모 타입의 객체를 가리킬 수 없다.
참조변수의 형변환
-사용할 수 있는 맴버의 갯수를 조절하는 것
-부모 자손 관계의 참조변수는 서로 형변환 가능
자손타입->부모타입 : 형변환 생략가능
자손타입<-부모타입 : 형변환 생략불가
instanceodf 연산자
-참조변수의 형변환 가능여부 확인에 사용. 가능하면 true 반환
매개변수의 다형성
-참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
장점
-다형적 매개변수
-하나의 배열로 여러종류 객체 다루기
추상클래스(abstract class)
선언부만 있고 구현부가 없는 메서드
-일반메서드가 추상메서드를 호출할 수 있다.
-완성된 설계도가 아니므로 인스턴스를 생성할 수 없다.
-다른 클래스를 작성하는 데 도움을 줄 목적으로 작성된다.
-꼭 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우에 사용
-추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부를 완성해야 한다.
인터페이스(interface)
-일종의 추상클래스. 추상클래스(미완성 설계도)보다 추상화 정도가 높다.
-실제 구현된 것이 전혀 없는 기본 설계도
-추상메서드와 상수만을 멤버로 가질 수 있다.
-인스턴스를 생성할 수 없고, 클래스 작성에 도움을 줄 목적으로 사용된다.
-미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용된다.
-인터페이스도 클래스처럼 상속이 가능하다.(클래스와 달리 다중상속 허용)
-인터페이스는 Object클래스와 같은 root가 없다.
-인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다. 다만 'extends' 대신 'implements'를 사용
-인터페이스에 정의된 추상메서드를 완성해야 한다.
-상속과 구현이 동시에 가능하다.
-인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
class Fighter extends implements Fightable {
public void move(int x, int y) { /* 내용 생략 */ }
public void attack(Fightable f) { /* 내용 생략 */ }
}
Fighter f = new Fighter();
Fightable f = new Fighter();
-인터페이스를 메서드의 매개변수 타입으로 지정할 수 있다.
-인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
장점
1. 개발시간을 단축시킬 수 있다.
-메서드를 호출하는 쪽에서는 선언부만 알면 되고 동시에 다른 한 쪽에서는 인터페이스를 구현하는 클래스를 작성하도록 하여, 인터페이스 구현하는 클래스가 작성될 때까지 기다리지 않고 양쪽에서 동시에 개발 진행 가능
2. 표준화 가능
-기본 틀을 인터페이스로 작성한 다음, 개발자들에게 인터페이스를 구현하게 프로그램을 작성하도록 함으로써 보다 일관되고 정형화된 프로그램 개발 가능
3. 서로 관계없는 클래스들에게 관계 부여
-인터페이스를 공통적으로 구현하도록 함으로써 관계 부여
4. 독립적인 프로그래밍 가능
-인터페이스를 이용하면 클래스의 선언과 구현을 분리시킬 수 있기 때문에 실제구현에 독립적인 프로그램을 작성 가능
'Language > Java' 카테고리의 다른 글
| Java의 정석 정리 4 (1) | 2023.09.18 |
|---|---|
| Java의 정석 정리 3 (0) | 2023.09.15 |
| Java의 정석 정리 (0) | 2023.09.07 |
| 강의 내용 정리 2 (0) | 2023.03.08 |
| 강의 내용 정리 1 (0) | 2023.03.04 |