📂Java34_Static ~ 📂Java40_Interface
객체를 생성하지 않고도 메모리상에 올라감, 클래스 이름을 통해 접근할 수 있음
📂Java34_Static
더 이상 변경할 수 없다는 의미를 가지고 있음
📂Java35_Final
클래스 안에 클래스를 만드는 것을 의미
public class MainClass {
public static void main(String[] args) {
// 일반 중첩 클래스의 객체를 생성한다.
// 외부 클래스의 객체를 생성한다.
OuterClass1 out1 = new OuterClass1();
// 이를 통해 내부 클래스의 객체를 생성한다.
OuterClass1.InnerClass1 in1 = out1.new InnerClass1();
System.out.printf("in1 : %s\n", in1);
}
}
class OuterClass1 {
int outerMemberA = 100;
public void outerMethodA() {
System.out.println("outerMethod!");
// 내부 클래스의 멤버를 사용한다. -> 오류 발생
// System.out.printf("innerMemberA : %d\n", innerMemberA);
// innerMethodA();
}
class InnerClass1 {
int innerMemberA = 200;
public void innerMethodA() {
System.out.println("innerMethod!");
}
public void innerMethodB() {
// 외부 클래스에 정의된 멤버를 사용한다.
System.out.printf("OuterMemberA : %d\n", outerMemberA);
outerMethodA();
}
}
}
public class MainClass {
public static void main(String[] args) {
// static 중첩 클래스는 외부클래스의 객체 없이 바로 생성이 가능하다.
OuterClass2.InnerClass2 in2 = new OuterClass2.InnerClass2();
System.out.printf("in2 : %s\n", in2);
}
}
class OuterClass2 {
// 외부 클래스에 정의된 static 변수
static int outerMemberA = 200;
// 외부 클래스에 정의된 멤버 변수
int outerMemberB = 300;
// 내부 클래스의 static 멤버 사용
public void outerMehod1() {
System.out.println(InnerClass2.innerMemberA);
// System.out.println(InnerClass2.innerMemberB);
}
// static 중첩 클래스
static class InnerClass2 {
// 내부 클래스에 정의된 static 변수
static int innerMemberA = 100;
// 내부 클래스에 정의된 멤버 변수
// int innerMemberB = 300;
public void innerMethod1() {
// 외부 클래스에 정의된 static 변수
// 외부 클래스의 이름을 생략할 수 있다.
System.out.println(outerMemberA);
// 외부 클래스에 정의된 멤버 변수 사용 불가
// System.out.println(outerMemberB);
}
}
}
➡️ OuterClass3$InnerClass3 파일이 존재하지 않는 것을 확인할 수 있음
class OuterClass3 {
// 지역 중첩클래스 타입의 멤버변수 선언
// InnerClass3 in30;
public void outerMethod3() {
// 지역 중첩 클래스
class InnerClass3 {
}
// 지역 중첩 클래스 객체 생성
InnerClass3 in3 = new InnerClass3();
System.out.println(in3);
}
// 다른 메서드에서 사용
// public void outerMethod30(InnerClass3 in34) {
// InnerClass3 in33;
// }
}
public class MainClass {
public static void main(String[] args) {
// 익명 중첩 클래스
// SuperClass100을 상속받은 이름이 없는 클래스를 작성하고
// 필요한 메서드들을 overriding한다.
// 그리고 자식클래스의 객체를 생성해준다.
SuperClass100 s100 = new SuperClass100() {
@Override
public void superMethod100() {
System.out.println("overriding된 메서드");
}
};
s100.superMethod100();
}
}
class SuperClass100 {
public void superMethod100() {
System.out.println("superMethod100");
}
}
📂Java36_InnerClass
public abstract void method()
public abstract class ClassName { }
extends
public class MainClass {
public static void main(String[] args) {
// 추상 클래스 객체 생성
// 추상 클래스는 완벽한 클래스가 아니기 때문에
// 직접 객체를 생성하는 것이 불가능하다.
// TestClass1 t1 = new TestClass1();
TestClass2 t2 = new TestClass2();
t2.testMethod1();
t2.testMethod2();
TestClass1 t1 = new TestClass2();
t1.testMethod2();
TestClass1 t10 = new TestClass1() {
@Override
public void testMethod2() {
System.out.println("익명 중첩 클래스 사용");
}
};
t10.testMethod2();
}
}
// 추상클래스
abstract class TestClass1 {
public void testMethod1() {
System.out.println("일반 메서드");
}
// 추상메서드
abstract public void testMethod2();
}
// 추상 클래스를 상속받아 구현한 클래스
class TestClass2 extends TestClass1{
@Override
public void testMethod2() {
System.out.println("TestClass2에서 구현한 testMethod2");
}
}
📂Java38_Abstract
implements
public class MainClass {
public static void main(String[] args) {
// 인터페이스에 정의한 변수 사용
System.out.printf("TestInterface1.a1 : %d\n", TestInterface1.a1);
TestClass1 t1 = new TestClass1();
t1.testMethod1();
t1.testMethod2();
// 클래스가 구현한 인터페이스 타입형 변수에 담을 수 있다.
TestInterface1 t10 = new TestClass1();
t10.testMethod1();
TestInterface2 t20 = new TestClass1();
t20.testMethod2();
}
}
// 인터페이스는 클래스가 아니라서 객체를 생성하지 못함
interface TestInterface1 {
// 인터페이스에 정의한 변수는 static final 변수이다.
int a1 = 100;
// 메서드
// 인터페이스에 정의한 메서드는 추상 메서드이다.
public void testMethod1();
// 인터페이스에 static 메서드를 정의할 수 있다.
public static void testMethod100() {
System.out.println("testMethod100");
}
}
interface TestInterface2 {
public void testMethod2();
}
// 인터페이스를 구현한 클래스
// 인터페이스는 다수를 구현할 수 있다.
class TestClass1 implements TestInterface1, TestInterface2 {
@Override
public void testMethod1() {
// TODO Auto-generated method stub
System.out.println("TestClass1의 testMethod1");
System.out.printf("a1 : %d\n", a1);
}
@Override
public void testMethod2() {
// TODO Auto-generated method stub
System.out.println("TestClass1의 testMethod2");
}
}
📂Java40_Interface