4장 내용(2)

instanceof 연산자

instanceof 연산자는 만들어진 객체가 특정 클래스의 인스턴스인지 물어보는 연산자이다. instanceof는 결과값으로 true 또는 false를 반납한다.

객체참조변수 instanceof 클래스명


class 대한민국{
	
}

class 서울 extends 대한민국{
	
}

class 강남 extends 서울{
	
}

public class Driver{
	public static void main(String[] args){
    	대한민국 나라객체  = new 대한민국();
    	서울 도시객체 = new 서울();
    	강남 구객체 = new 강남();
    	
    	System.out.println(나라객체 instanceof 대한민국);

    	System.out.println(도시객체 instanceof 대한민국);
    	System.out.println(도시객체 instanceof 서울);
    	
    	System.out.println(구객체 instanceof 대한민국);
    	System.out.println(구객체 instanceof 서울);
    	System.out.println(구객체 instanceof 강남);
    	
    	System.out.println(구객체 instanceof Object);
    }
}

[그림 4.1] Driver.java


[그림 4.1]을 실행시켜보면 전부 true가 출력되는 것을 확인할 수 있다. [그림 4.2]를 살펴보자.


class 대한민국{
	
}

class 서울 extends 대한민국{
	
}

class 강남 extends 서울{
	
}

public class Driver{
	public static void main(String[] args){
    	대한민국 나라객체  = new 대한민국();
    	대한민국 도시객체 = new 서울();
    	대한민국 구객체 = new 강남();
    	
    	System.out.println(나라객체 instanceof 대한민국);

    	System.out.println(도시객체 instanceof 대한민국);
    	System.out.println(도시객체 instanceof 서울);
    	
    	System.out.println(구객체 instanceof 대한민국);
    	System.out.println(구객체 instanceof 서울);
    	System.out.println(구객체 instanceof 강남);
    	
    	System.out.println(구객체 instanceof Object);
    }
}

[그림 4.2] Driver.java


[그림4.2]을 실행하면 모두 true가 출력되는 것을 확인할 수 있다. 이는 instenceof가 객체 참조 변수의 타입이 아닌 실제 객체의 타입에 의해 처리하기 때문이다.

package 키워드

package 키워드는 네임스페이스(이름공간)를 만들어주는 역할을 한다. 이는 같은 이름의 클래스 끼리의 충돌을 방지하기 위해 사용한다.
예를 들어, 하나의 프로젝트에 여러개의 팀이 참여한다고 가정해 보다. 1팀이 Drive라는 클래스를 만들 수 있을 것이다. 그런데 2팀도 Drive라는 클래스를 만든다면 이 두 개의 클래스는 이름 충돌이 발생 한다. 이 때, 이름 공간을 나누어 1팀은 firstteam.Drive라고 클래스의 전체 이름을 지정하고, 2팀에서는 secondteam.Drive라고 클래스 전체 이름을 지으면 이름 충돌을 피할 수 있다. 두개의 클래스는 완전 별개의 클래스가 되는 것이다.


[그림 4.1] package 예시

interface 키워드와 implements 키워드

클래스를 이용하여 다중 상속을 할 경우 메소드 출처의 모호성 등 여러 가지 문제가 발생할 수 있기 때문에 자바에서는 다중 상속을 지원하지 않는다. 하지만 다중 상속의 이점을 버릴 수는 없기 때문에 자바에서는 interface라는 사용한다. interface란 다른 클래스를 작성할 때 기본이 되는 틀을 제공하면서, 다른 클래스 사이의 중간 매개 역할을 담당하는 클래스 입니다.


[그림 4.2] interface 예제

[그림 4.2]롸 같이 imterface는 be able to, 즉 "무엇을 할 수 있는"이라는 표현 형태로 만드는 것이 좋다.

interface 키워드 사용


interface Swimmable{
	double PI = 3.14159;
    
    void swim();
}

class Duck implements swimmable{
	public void swim(){
    	System.out.println("참방 참방");
    }
}

public class Driver{
	public static void main(String[] args){
    	System.out.println(swimmable.PI);
        
        Duck duck = new Duck();
        duck.swim();
    }
}

[그림 4.3] Driver.java


interface는 public 추상 메서드와 public 정적 상수만 가질 수 있다. 그런데 [그림 4.3]의 Swimmable interface를 보면 변수 PI에 final이나 static이 보이지 않는다. 또, 추상을 의미하는 abstract가 swim() 메서드에 보이지가 않는다. 하지만 컴파일 에러가 일어나지 않는다.
인터페이스는 추상 메서드와 정적 상수만 가질 수 있기에 따로 메서드에 public과 abstract, 필드에 public, static 그리고 final을 붙이지 않아도 자바가 자동으로 붙여준다. 즉, [그림 4.3]과 [4.4]는 동일한 코드이다.


interface Swimmable{
	public static final double PI = 3.14159;
    
    public abstract void swim();
}

class Duck implements swimmable{
	public void swim(){
    	System.out.println("참방 참방");
    }
}

public class Driver{
	public static void main(String[] args){
    	System.out.println(swimmable.PI);
        
        Duck duck = new Duck();
        duck.swim();
    }
}

[그림 4.4] Driver.java


this 키워드

this 키워드는 인스턴스가 자기 자신을 지칭할 때 쓰는 키워드이다.


class Bank{
	int money = 1000;
    
    void display(){
    	int money = 500;
        
        System.out.println(money);
        System.out.println(this.money);
    }
}

public class Driver{
	public static void main(String[] args){
    	Bank bank = new Bank();
        bank.display();
    }
}

[그림 4.5] Driver.java


  • 지역 변수와 속성(객체 변수, 정적 변수)의 이름이 같은 경우 지역 변수가 우선한다.

  • 객체 변수와 이름이 같은 지역 변수가 있는 경우 객체 변수를 사용하려면 this를 접두사로 사용한다.

  • 정적 변수와 이름이 같은 지역 변수가 있는 경우 정적 변수를 사용하려면 클래스명을 접두사로 사용한다.

    때문에 [그림4.5]에서 println(money)에서는 지역 변수 money의 값인 500이 출력되고, println(this.money)에서는 객체 변수 money의 값인 10000이 출력된다.

    super 키워드

    this가 인스턴스 메서드 내부에서 객체 자신을 지칭하는 키워드라고 한다면, super는 바로 위 상위 클래스의 인스턴스를 지칭하는 키워드 이다.


class Animal{
	void method(){
    	System.out.println("동물");
    }
}

class Dog extends Animal{
	void method(){
    	super.method();
        System.out.println("강아지");
    }
}

public class Driver{
	public static void main(String[] args){
    	Dog dog = new Dog();
        dog.method();
    }
}

[그림 4.6]


[그림 4.6]에서 super 키워드를 이용해 상위 클래스의 인스턴스 메서드를 호출하고 있다. super 키워드는 바로 위의 상위 클래스 인스턴스에는 접근할 수 있지만 super.super 형태로 상위의 상위 클래스의 인스턴스에는 접근이 불가능하다.

좋은 웹페이지 즐겨찾기