본문 바로가기
프로그래밍 언어/자바

자바 클래스와 객체 #6

by 블루데이제이 2022. 9. 12.
728x90
반응형

내부 클래스

내부 클래스란 클래스 내부에 포함된 클래스를 의미합니다.

내부 클래스 특징

1. 내부 클래스는 외부 클래스의 변수나 메소드에 접근할 수 있습니다.

2. 내부 클래스를 사용하기 위해서는 반드시 객체를 생성해야 합니다.

3. 내부 클래스는 static 변수나 메소드를 가질 수 없습니다. 단, 상수는 가능합니다.

4. 내부 클래스는 외부에서 단독으로 접근 할 수 없습니다.

 

예제를 통해서 알아보도록 하겠습니다.

InnerTest라는 클래스를 생성합니다.

 

package com.bluedayj;

public class InnerTest {
	public static void main(String[] args) {
		Outer outer = new Outer();
		
		Outer.Inner inner = outer.in; //제3의 클래스에서 내부 클래스를 사용하기 위해서는 외부클래스를 이용해야 합니다.
		inner.printInner();
		
	}
}


class Outer{ //외부 클래스
	public Inner in;                        //내부 클래스의 레퍼런스 변수
	private String name = "외부클래스";
	
	public Outer() {
		in = new Inner();     //내부 클래스를 사용하기 위해서는 객체를 생성해야 합니다.
		in.printInner();      //내부 클래스 메소드 호출
		
	}
	
	public void printOuter() {
		System.out.println(name);
	}
	
	class Inner{ //내부 클래스
		final static String name = "내부클래스"; //static 상수는 내부 클래스에서 사용가능
		public void printInner() {
			printOuter();       //외부 클래스 메소드 호출
			System.out.println(name);
			
		}
	}
}

 

추상 클래스

추상 클래스는 말 그대로 추상적인 것 입니다.

유선전화, 무선전화, 휴대폰, 공중전화 등등의 클래스는 세분화된 클래스이고 전화라고 하면 일반화된 클래스라고 이해하시면 될것 같습니다.

예를 들어 유선전화로 전화한다. 스마트폰으로 전화한다. 라고 생각해 보면 전화로 전화한다라고는 어떻게 나타낼까요? 전화는 무선, 유선전화, 스마트폰의 상위개념이기 때문에 특별히 표현할 방법이 없습니다. 그렇지만 전화한다라는 개념은 가지고 있어야 합니다.

구체적으로 표현할 수 없을 때 abstract라는 메소드를 사용합니다. abstract 메소드는 메소드만 존재할 뿐 그것에 대한 구체적인 구현은 하지 않습니다.

추상 클래스는 단순히 abstract 메소드를 가지고 있는 클래스를 말하는 것입니다.

예제를 통해 알아보도록 하겠습니다.

CallPhone이라는 클래스를 생성합니다.

package com.bluedayj;

public class CallPhone {
	public static void main(String[] args) {
		PublicPhone publicPhone = new PublicPhone();
		SmartPhone smartPhone = new SmartPhone();
		
		Phone phone1 = (Phone) publicPhone;
		Phone phone2 = (Phone) smartPhone;
		
		System.out.println(phone1.getPhoneNumber());
		phone1.call();
		System.out.println(phone2.getPhoneNumber());
		phone2.call();
		
	}
}


abstract class Phone{
	private String phoneNumber = "010-1234-5678";
	
	public abstract void call();

	public String getPhoneNumber() {
		return phoneNumber;
	};
}


class PublicPhone extends Phone{
	public String getName() {
		return "공중전화";
	}
	
	public void call() {
		System.out.println(this.getName() + "에서 전화를 건다");
	}
	
}

class SmartPhone extends Phone{
	public String getName() {
		return "스마트폰";
	}
	
	public void call() {
		System.out.println(this.getName() + "에서 전화를 건다");
	}
}

abstract 클래스는 객체를 생성할 수는 없지만 대입을 통하여 레퍼런스로 사용할 수 있습니다.

 

인터페이스

인터페이스는 메소드에 대한 선언만 할 수 있으며, 그것에 대한 구현을 할 수 없습니다.

인터페이스 정의

1. 다중 상속을 위한 클래스의 대안

2. 다형성에 의한 클래스 제어

인터페이스 포함 멤버

1. 필드

2. 메소드

3.정적 중첩 클래스

■ 필드

인터페이스에서 필드를 사용하려면 직접 값을 할당하는 방식으로 합니다.

package com.bluedayj;

interface A{
	int w = 10;
	int h = 20;
	
	static int  x = 1;
	final int y = 2;
	public static final int z = 3;
}

public class InterfaceTest {
	public static void main(String[] args) {
		A a = new A();
	}
}

소스 코드 처럼하면 A a = new A();에서 오류가 발생할 것입니다.

인터페이스에는 생성자가 없어서 객체를 생성 시킬 수 없습니다.

package com.bluedayj;

interface A{
	int w = 10;
	int h = 20;
	
	static int  x = 1;
	final int y = 2;
	public static final int z = 3;
}

public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println("w = " + A.w);
		System.out.println("h = " + A.h);
		System.out.println("x = " + A.x);
		System.out.println("y = " + A.y);
		System.out.println("z = " + A.z);
	}
}

위 소스 코드처럼 수정하고 실행하면 정상적으로 출력이 됩니다.

 

■ 메소드

인터페이스에서 메소드는 무조건 public abstract입니다. 그래서 무조건 상속받는 하위 클래스에 의해 오버라이딩되어야 합니다. 또한 오버라이딩 시에는 반드시 접근 제한자를 public으로 해야 합니다.

 

package com.bluedayj;

interface A{
	int w = 10;
	int h = 20;
	
	static int  x = 1;
	final int y = 2;
	public static final int z = 3;
	
	void a();
	public void b();
}

class B implements A{
	void a() {
		System.out.println("a 메소드");
	}
	
	public void b() {
		System.out.println("b 메소드");
	}
}

public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println("w = " + A.w);
		System.out.println("h = " + A.h);
		System.out.println("x = " + A.x);
		System.out.println("y = " + A.y);
		System.out.println("z = " + A.z);
		
		
	}
}

 

인터페이스에 메소드를 추가하고 A인터페이스를 상속받는 B클래스를 생성합니다.

소스 코드를 실행하면 오류가 발생합니다.

 

이유는 A인터페이스의 a 메소드와 B클래스의 a메소드에 public 제한 접근자가 없어서 생기는 오류입니다.

 


 

■ 정적 중첩 클래스

인터페이스 내부에 클래스가 중첩되어 들어갈 수 있으며 클래스는 무조건 public&static입니다.

 

package com.bluedayj;

interface A{
	int w = 10;
	int h = 20;
	
	static int  x = 1;
	final int y = 2;
	public static final int z = 3;
	
	public void a();
	public void b();
	
	class C{
		private int c;
		public C() {
			this.c = 100;
		}
		
		public void print() {
			System.out.println("x : " + x);
			System.out.println("c : " + c);
		}
	}
}

class B implements A{
	public void a() {
		System.out.println("a 메소드");
	}
	
	public void b() {
		System.out.println("b 메소드");
	}
}

public class InterfaceTest {
	public static void main(String[] args) {
		System.out.println("w = " + A.w);
		System.out.println("h = " + A.h);
		System.out.println("x = " + A.x);
		System.out.println("y = " + A.y);
		System.out.println("z = " + A.z);
		
		B b = new B();
		b.a();
		b.b();
		
		A.C ac = new A.C();
		ac.print();
		
	}
}

A인터페이스 내부에 C 클래스를 생성합니다. C클래스에 생성자와 메소드를 입력하고

main에서 인터페이스.클래스 형태로 객체를 생성하고 메소드를 호출하면 실행이 됩니다.

 

728x90
반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 문자열 다루기 #2  (0) 2022.09.12
자바 문자열 다루기 #1  (0) 2022.09.12
자바 클래스와 객체 #5  (0) 2022.09.12
자바 클래스와 객체 #4  (0) 2022.09.11
자바 클래스와 객체 #3  (0) 2022.09.11