Java 개념정리 15일차

2026. 1. 20. 12:47대우개발원 수업 내용/Java 정리

반응형

[중첩 클래스]

로컬 클래스
▪ 중첩 클래스를 메소드 내에서 선언할 수 있음
▪ 접근 제한자 및 static 붙일 수 없음
▪ 인스턴스 필드와 메소드만 선언할 수 있고 정적 필드와 메소드는 선언 불가

 

로컬 클래스
▪ 생성자 또는 메소드 내부에서 다음과 같이 선언된 클래스
▪ 생성자와 메소드가 실행될 동안에만 객체를 생성할 수 있음

 

바깥 클래스의 멤버 접근 제한
▪ 정적 멤버 클래스 내부에서는 바깥 클래스의 필드와 메소드를 사용할 때 제한이 따름
▪ 정적 멤버 클래스는 바깥 객체가 없어도 사용 가능해야 하므로 바깥 클래스의 인스턴스 필드와
인스턴스 메소드는 사용하지 못함
바깥 클래스의 객체 접근
▪ 중첩 클래스 내부에서 바깥 클래스의 객체를 얻으려면 바깥 클래스 이름에 this를 붙임

 

[중첩 클래스의 접근 제한]

 바깥 필드와 메소드에서 사용 제한
▪ 바깥 클래스에서 인스턴스 멤버 클래스 사용하는 경우

 

멤버 클래스에서 사용 제한
▪ 멤버 클래스 내부에서 바깥 클래스의 필드와 메소드에 접근하는 경우

 

로컬 클래스에서 사용 제한
▪ 메소드의 매개 변수나 로컬 변수를 로컬 클래스에서 사용할 때의 제한
▪ 메소드가 종료되어도 계속 실행 상태로 존재하는 로컬 스레드 객체의 경우 등
▪ 매개 변수나 로컬 변수를 final 키워드로 선언해야 함
▪ 자바 8부터는 final 선언 하지 않아도 final 특성 부여되어 있음

 

중첩 클래스에서 바깥 클래스 참조 얻기
▪ 바깥 클래스의 이름을 this 앞에 붙임

실행 사진 및 출력결과

더보기

 

출력결과

B-field
B-method
A-field
A-method

실행코드

더보기
package sec01;

public class A {
	// A의 인스턴스 필드와 메소드
	int field1;
	String field = "A-field";
	void method1() {}
	void method() {
		System.out.println("A-method");
	}
	
	// A의 정적 필드와 메소드
	static int field2;
	static void method2() {}
	
	//인스턴스 멤버 클래스
	class B {
		// B 인스턴스 필드
		String field = "B-field";
		void method() {
			//A의 인스턴스 필드와 메소드 사용
			field1 = 10;	// (o)
			method1();		// (o)
			//A의 정적 필드와 메소드 사용
			field2 = 10;	// (o)
			method2();		// (o)
			System.out.println("B-method");
		}
		
		// B 인스턴스 메소드
		void print() {
			//B 객체의 필드와 메소드 사용
			System.out.println(this.field);
			this.method();
			//A 객체의 필드와 메소드 사용
			System.out.println(A.this.field);
			A.this.method();
		}
	}
	// 정적 멤버 클래스
	static class c {
		void method() {
			//A의 인스턴스 필드와 메소드 사용
//			field1 = 10;	// (x)
//			method1();		// (x)
			//A의 정적 필드와 메소드 사용
			field2 = 10;	// (o)
			method2();		// (o)
		}
	}
	
	// A의 인스턴스 메서드
	void useB() {
		B b = new B();
		b.print();
	}
}

 

package sec01;

public class AEx {

	public static void main(String[] args) {
	// A 객체 생성
		A a = new A();
		
		// A 메서드 호출
		a.useB();

	}

}

[중첩 인터페이스]

중첩 인터페이스
▪ 클래스의 멤버로 선언된 인터페이스
▪ 해당 클래스와 긴밀한 관계 맺는 구현 클래스 만들기 위함
▪ 인스턴스 멤버 인터페이스와 정적 멤버 인터페이스 모두 가능함

 

중첩 인터페이스
▪ 해당 클래스와 긴밀한 관계를 맺는 구현 객체를 만들기 위해 클래스의 멤버로 선언된 인터페이스
▪ 안드로이드와 같은 UI 프로그램에서 이벤트를 처리할 목적으로 많이 활용

 

실행 사진 및 출력결과

더보기

 

출력결과

Ok 버튼을 클릭했습니다.
Cancel 버튼을 클릭했습니다.

실행코드

더보기
package sec02;

public class Button {
	//정적 멤버 인터페이스
	public static interface ClickListener {
		// 추상 메소드
		void onClick();
	}
	
	// 필드
	private ClickListener clickListener;
	
//	public ClickListener getClickListener() {
//		return clickListener;
//	}
	
	public void  setClickListener(ClickListener clickListener) {
		this.clickListener = clickListener;
	}
	
	public void click() {
		this.clickListener.onClick();
	}
}

 

package sec02;

//import sec02.Button.ClickListener;

public class ButtonEx {

	public static void main(String[] args) {
		//Ok 버튼 객체 생성
		Button btnOk = new Button();
		
		// 로컬 클래스
		//Ok 버튼 클릭 이벤트를 처리할 ClickListener 구현 클래스
		class OkListener implements Button.ClickListener {
			@Override
			public void onClick() {
				System.out.println("Ok 버튼을 클릭했습니다.");
			}
		}
		
//		Ok 버튼 객체에 ClickListener 구현 객체 주입
		btnOk.setClickListener(new OkListener());
		
		// Ok 버튼 클릭하기
		btnOk.click();
		
		//----------------------------------------------------------------
		
		// Cancle 버튼 객체 생성
		Button btnCancel = new Button();
		
		//Cancel 버튼 클릭 이벤트를 처리할 ClickListener 구현 클래스(로컬 클래스)
		class CancelListener implements Button.ClickListener {
			@Override
			public void onClick() {
				System.out.println("Cancel 버튼을 클릭했습니다.");
			}
		}
		
//		Cancel 버튼 객체에 ClickListener 구현 객체 주입
		btnCancel.setClickListener(new CancelListener());
		//Cancel 버튼 클릭하기
		btnCancel.click();
	}

}

익명 객체
▪ 이름이 없는 객체. 명시적으로 클래스를 선언하지 않기 때문에 쉽게 객체를 생성할 수 있음
▪ 필드값, 로컬 변수값, 매개변수값으로 주로 사용
익명 자식 객체
▪ 부모 클래스를 상속받아 생성되는 객체
▪ 부모 타입의 필드, 로컬 변수, 매개변수의
값으로 대입할 수 있음
익명 구현 객체
▪ 인터페이스를 구현해서 생성되는 객체
▪ 인터페이스 타입의 필드, 로컬변수, 매개변수
의 값으로 대입할 수 있음
▪ 안드로이드와 같은 UI 프로그램에서 이벤트를 처리하는 객체로 많이 사용

 

익명 (anonymous) 객체
▪ 이름이 없는 객체
▪ 어떤 클래스를 상속하거나 인터페이스를 구현하여야 함

 

익명 자식 객체 생성
▪ 일반적인 경우 부모 타입의 필드나 변수 선언하고 자식 객체를 초기값으로 대입하는 경우
• 부모 클래스 상속하여 자식 클래스 선언
• new 연산자 이용하여 자식 객체 생성 후 부모 타입의 필드나 변수에 대입

 

자식 클래스를 재사용하지 않고 특정 위치에서만 사용하려는 경우
• 익명 자식 객체 생성하여 사용
• 필드 선언할 때 초기값으로 익명 자식 객체 생성하여 대입

 

 

[익명 자식 객체 생성]

• 메소드 내에서 로컬 변수 선언 시 초기값으로 익명 자식 객체 생성하여 대입

• 메소드 매개 변수가 부모 타입일 경우 메소드 호출하는 코드에서 익명 자식 객체 생성하여 매개값으로 대입

▪ 익명 자식 객체에 새롭게 정의된 필드 및 메소드는 익명 자식 객체 내부에서만 사용되고 외부에서는 접근할 수 없음

 

실행 사진 및 출력결과

더보기

 

출력결과

일반 타이어가 굴러갑니다.
익명 자식 Tire 객체1이 굴러갑니다.
익명 자식 Tire 객체2가 굴러갑니다.
익명 자식 Tire 객체2가 굴러갑니다.

실행코드

더보기
package Tire;

public class Car {
	// 필드에 Tire 객체 대입
	private Tire tire1 = new Tire();

	// 필드에 익명 자식 객체 대입
	private Tire tire2 = new Tire() {
		@Override
		public void roll() {
			System.out.println("익명 자식 Tire 객체1이 굴러갑니다.");
		}
	};

	// 메소드(필드 이용)
	public void run1() {
		tire1.roll();
		tire2.roll();
	}

	// 메소드 (로컬변수 이용)
	public void run2() {
		// 로컬 변수에 익명 자식 객체 대입
		Tire tire = new Tire() {
			@Override
			public void roll() {
				System.out.println("익명 자식 Tire 객체2가 굴러갑니다.");
			}
		};
		tire.roll();
	}

	// 메소드(매개변수 이용)
	public void run3(Tire tire) {
		tire.roll();
	}
}

 

package Tire;

public class Tire {
	public void roll() {
		System.out.println("일반 타이어가 굴러갑니다.");
	}
}
package Tire;

public class CarEx {

	public static void main(String[] args) {
		// Car 객체 생성
		Car car = new Car();
		// 익명 자식 객체가 대입된 필드 사용
		car.run1();
		// 익명 자식 객체가 대입된 로컬 변수 사용
		car.run2();
		// 익명 자식 객체가 대입된 매개변수 사용
		car.run3(new Tire() {
			@Override
			public void roll() {
				System.out.println("익명 자식 Tire 객체2가 굴러갑니다.");
			}
		});
	}

}

[익명 구현 객체 생성]

 인터페이스 타입의 필드 혹은 변수 선언 후 구현 객체를 초기값으로 대입하는 경우
▪ 구현 클래스가 재사용되지 않고 특정 위치에서만 사용되는 경우 – 익명 구현 객체 생성

위의 코드에서 

객체를 대입하는걸로 변경

 



실행 사진 및 출력결과

더보기

 

출력결과

TV를 켭니다.
TV를 끕니다.
에어컨을 켭니다.
에어컨을 끕니다.
난방을 켭니다.
난방을 끕니다.

실행코드

더보기
package inter;

public class Home {
	// 필드에 익며 ㅇ구현 객체 대입
	private RemoteControl rc = new RemoteControl() {
		
		@Override
		public void turnOn() {
			System.out.println("TV를 켭니다.");
			
		}
		
		@Override
		public void turnOff() {
			System.out.println("TV를 끕니다.");
			
		}
	};
	// 메소드(필드 이용)
	public void use1() {
		rc.turnOn();
		rc.turnOff();
	}
	// 메소드(로컬변수 이용)
	public void use2() {
		//로컬 변수에 익명 구현 객체 대입
		RemoteControl rc = new RemoteControl() {
			
			@Override
			public void turnOn() {
				System.out.println("에어컨을 켭니다.");
				
			}
			
			@Override
			public void turnOff() {
				System.out.println("에어컨을 끕니다.");
				
			}
		};
		rc.turnOn();
		rc.turnOff();
	}
	// 메소드(매개변수 이용)
	public void use3(RemoteControl rc) {
		rc.turnOn();
		rc.turnOff();
	}
}
package inter;

public interface RemoteControl {
	// 추상 메서드
	void turnOn();
	void turnOff();
}
package inter;

public class HomeEx {

	public static void main(String[] args) {
		//Home 객체 생성
		Home home = new Home();
		//익먕 구현 객체가 대입된 필드 사용
		home.use1();
		//익명 구현 객체가 대입된 로컬 변수 사용
		home.use2();
		//익명 구현 객체가 대입된 매개변수 사용
		home.use3(new RemoteControl() {
			
			@Override
			public void turnOn() {
				System.out.println("난방을 켭니다.");
				
			}
			
			@Override
			public void turnOff() {
				System.out.println("난방을 끕니다.");
				
			}
		});

	}

}

[라이브러리]

라이브러리 추가하기
▪ 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것
▪ 일반적으로 JAR 압축 파일(~.jar) 형태. 클래스와 인터페이스의 바이트코드 파일(~.class )들이 압축
▪ 라이브러리 JAR 파일을 사용하려면 ClassPath(클래스를 찾기 위한 경로)에 추가
▪ 콘솔(명령 프롬프트 또는 터미널)에서 프로그램을 실행할 경우: java 명령어를 실행할 때
-classpath로 제공. 또는 CLASSPATH 환경 변수에 경로 추가
▪ 이클립스 프로젝트에서 실행할 경우: 프로젝트의 Build Path에 추가

실행 사진 및 출력결과

더보기


출력결과

A-method 실행
B-method 실행

실행코드

더보기
package pakc1;

public class A {
	// 메소드
	public void method() {
		System.out.println("A-method 실행");
	}
}
package pack2;

public class B {
	// 메소드
	public void method() {
		System.out.println("B-method 실행");
	}
}
package app;

import pack2.B;
import pakc1.A;

public class Main {

	public static void main(String[] args) {
		// 라이브러리에서 가져온 A 클래스 사용
		A a = new A();
		a.method();
		
		// 라이브러리에서 가져온 B 클래스 사용
		B b = new B();
		b.method();

	}

}
// cmd에서 실행
// E:\eclipse_java\my_app\bin>java -cp E:\eclipse_java\my_lib\dist\my_lib.jar;. app.Main

 

 


 

'대우개발원 수업 내용 > Java 정리' 카테고리의 다른 글

Java 개념정리 16일차  (0) 2026.01.21
Java 개념정리 14일차  (0) 2026.01.19
Java 개념 정리 13일차  (1) 2026.01.15
Java 개념정리 12일차  (2) 2026.01.15
Java 개념정리 11일차  (1) 2026.01.13