Java

자바 step9 - AbstractClass(클래스 안에 클래스(내부 클래스))

코딩탕탕 2022. 11. 6. 14:42

 

package test.mypac;

public class Zoo {
	/*
	 *   클래스 안에 정의할 수 있는게 뭐가 있지요?
	 *   
	 *   생성자, 필드, 메소드, 클래스
	 */
	//클래스 안에 클래스(내부 클래스)
	public class Monkey{
		public void say() {
			System.out.println("안녕! 나는 원숭이야");
		}
	}
	//내부 클래스
	public class Tiger{
		public void say() {
			System.out.println("안녕!~ 나는 호랑이야");
		}
	}
	//메소드
	public Monkey getMonkey() { //내부 클래스로 객체를 생성해서 리턴해주는 메소드 
		return new Monkey();
	}
	public Tiger getTiger() {
		return new Tiger();     
	}
}

Zoo class를 생성하였고, 그 안에서 다시  Monkey, Tiger class를 생성하였다(내부 클래스).

 

 

package test.main;

import test.mypac.Zoo;
import test.mypac.Zoo.Monkey;
import test.mypac.Zoo.Tiger;

public class MainClass03 {
	public static void main(String[] args) {
		/*
		 *  1. Zoo 객체를 생성해서 참조값을 z 라는 지역 변수에 담아보세요.
		 *  
		 *  2. z 안에 있는 참조값을 이용해서 getMonkey() 메소드를 호출해서 리턴되는 값을
		 *     m1 이라는 지역 변수에 담아보세요.
		 *     
		 *  3. m1 안에 있는 참조값을 이용해서 say() 메소드를 호출해 보세요.
		 */
		Zoo z=new Zoo();
		Monkey m1=z.getMonkey();
		m1.say();
		
		
		// Zoo 클래스에 있는 getTiger() 메소드를 호출해서
		// 리턴되는 값을 t1 이라는 지역 변수에 담아보세요.
		
		// t1 안에 있는 참조값을 이용해서 say() 메소드를 호출해보세요.
		
		z.getTiger();
		Tiger t1=z.getTiger();
		t1.say();
		// 메소드 안에도 클래스를 정의할 수 있다. 해당 메소드 안에서만 사용 가능하다.
		class Gura{
			public void say() {
				System.out.println("안녕 나는 구라야!");
			}
		}
		Gura g1=new Gura();
		g1.say();
	}
}

<console>
안녕! 나는 원숭이야
안녕!~ 나는 호랑이야
안녕 나는 구라야!

먼저 Zoo 객체를 생성하고, 그 객체 안에 있는 getMonkey() 메소드를 호출한다. getMonkey() 메소드는 Monkey 객체를 생성하는 역할을 하고 있으며 메소드를 호출함으로서 m1이라는 변수명으로 객체를 생성할 수 있다.  Tiger 또한 매한가지다.

class 안에 class가 있기 때문에 단순히 Zoo class를 생성하여 Monkey나 Tiger의 say() 메소드는 사용할 수 없다.

 

해당 페이지에서 Gura라는 class를 생성하여 바로 객체생성을 하고 사용할 수도 있다.