본문 바로가기

JAVA

Nested class, Lambda basic & concept

interface Printable
{
	void print(String s);
}

class Outer //Outer class
{
	private static int num = 0;
	static class Nested1 //static Nested class
	{
		void add(int n)
		{
			//static class이므로 static 멤버변수에만 접근 가능.
			num += n;
		}
	}
	static class Nested2 //static Nested class
	{
		int get()
		{
			//static class이므로 static 멤버변수에만 접근 가능.
			return num;
		}
	}
	
	//Non-static Nested class or inner class
	private int num1 = 0;
   	//Member class
	class Member 
	{
		void add(int n)
		{
			num1 += n; //멤버변수에 접근가능
		}
		int get()
		{
			return num1; //멤버변수에 접근가능
		}
	}
	
	public Printable getPrinter()
	{
		//Local class
		class Printer implements Printable 
		{
			public void print(String s)
			{
				System.out.println("Local class");
			}
		}
		return new Printer();
	}
	
	public Printable getPrinter1()
	{
		return new Printable() { //Anonymous class
			public void print(String s)
			{
				System.out.println("Anonymous class");
			}
		};
	}
}

public class example {
	
	public static void main(String[] args)
	{
		Printable prn = (p) -> {System.out.println(p);};
		Printable prn1 = (String s) -> {System.out.println(s);};
		
		prn.print("Hello world");
		prn1.print("Hello world1");
		
		Outer.Nested1 n1 = new Outer.Nested1();
		Outer.Nested2 n2 = new Outer.Nested2();
		
		Outer outer = new Outer();
		Outer.Member n3 = outer.new Member();
		Printable n4 = outer.getPrinter();
		Printable n5 = outer.getPrinter1();
	}
}

class 안에 class를 Nested class라 부르며

static nested class 와 non-static nested class(==inner class) 로 분류된다.

 

static 메소드처럼 static nested class는 outer class의 static 변수에 접근 가능하다.

(outer class의 내부에 있으므로 private여도 접근이 가능하다.)

그러나 outer class의 인스턴스 변수에는 접근이 불가능하다.

(static의 특성을 고려하면 이는 당연하다.)

static이므로 outer class의 이름만 가지고 인스턴스 생성이 가능하다.

 

inner class역시 일반적인 메소드처럼 생각하면 인스턴스 변수에 접근 가능하다는 것은 충분히 이해가능하다.

그리고 inner class에는 3가지 종류가 있다.

 

1. Member class : 가장 일반적인 inner class라 볼 수 있다. outer class내에 정의 된다.

2. Local class : outer class의 메소드내에 정의 된다.

3. Anonymous class : interface를 구현하는 별도의 클래스를 따로 정의하지 않고, interface의 메소드만 구현한다.

 

인스턴스 생성을 위해 outer class의 인스턴스가 필요하다.

 

다음은 Lambda에 관한 것이다.

interface내 구현해야 할 메소드가 하나인 경우 람다로 처리 가능한데,

아래와 같은 식 한줄로 인터페이스를 구현 한다..

(매개변수 리스트) -> { 구현 };



'JAVA' 카테고리의 다른 글

클래스 패스, 패키지 & 접근 제어  (0) 2021.10.21
객체와 참조변수  (0) 2021.10.21
자바 자료형 및 기타 연산자  (0) 2021.10.21