본문 바로가기

Language/Java

Java의 정석 정리 2

참조변수 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