제주 탈출 일지

패스트캠퍼스 챌린지 28일차 본문

패스트캠퍼스 챌린지!

패스트캠퍼스 챌린지 28일차

귀건 2021. 10. 3. 21:37
728x90
반응형

Chapter 6. 자바의 다양한 기능들

람다식, 예외처리, io, 쓰레드 프로그래밍.

이거 다하면 7장에서 세미 프로젝트를 해볼 것.

 

01. 여러 내부 클래스의 정의와 유형

클래스 내부에 선언 한 클래스. 한 클래스 내부에서만 사용하려고 하는 경우가 많다. 그래서 private로 선언하는 경우가 많다.

중첩 클래스라고도 함

인스턴스 내부 클래스, 정적(stastic) 내부 클래스, 지역(local) 내부 클래스, 익명(anonymous) 내부 클래스(가장 많이 활용됨)

 

인스턴스 내부 클래스

외부 클래스가 생성된 후 생성

일반 내부 클래스에서는 정적 변수를 사용할 수 없음( 인스턴스의 생성과 상관없이 사용할 수있어야 하지만, 내부 클래스는 외부 클래스가 생성된 후 생성되기 때문에 안됨)

정적 내부 클래스에서 정적 변수를 사용해야 함.

 

package ch01;

class OutClass {
	
	private int num = 10;
	private static int sNum = 20;
	private InClass inClass;
	
	public OutClass() {
		inClass = new InClass();
	}
	
	private class InClass {
		
		int iNum = 100;
		
		void inTest() {
			System.out.println("OutClass num = " + num + "(외부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수)" );
			System.out.println("InClass inNum = " + iNum + "(내부 클래스의 인스턴스 변수");
		}
		
	}
	
	public void usingClass() {
		inClass.inTest();
	}
	
	static class InStaticClass {
		int iNum = 100;
		static int sInNum = 200;
		
		void inTest() {
			
			System.out.println("InClass num = " + iNum + "(내부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수)" );
			System.out.println("InClass inNum = " + sInNum + "(내부 클래스의 스태틱 변수");
		}
		
		static void sTest() {
			// 정적 내부 클래스에서 외부 클래스의 인스턴스 변수는 사용할 수 없다.
			//System.out.println("InClass num = " + iNum + "(내부 클래스의 인스턴스 변수)");
			System.out.println("OutClass sNum = " + sNum + "(외부 클래스의 스태틱 변수)" );
			System.out.println("InClass inNum = " + sInNum + "(내부 클래스의 스태틱 변수");
		}
	}
	
	
}

public class innerTest {

	public static void main(String[] args) {
		
		OutClass outClass = new OutClass();
		outClass.usingClass();
		
		//InClass가 private가 아니라면, 이렇게도 할 수는 있다.
//		OutClass.InClass inner = outClass.new InClass();
//		inner.inTest();
		
		//외부에서 바로 내부 정적 클래스를 생성할 수 있다.
		OutClass.InStaticClass sInClass = new OutClass.InStaticClass();
		sInClass.inTest();
		
		System.out.println();
		// 내부 정적 메소드는 바로 가져다 사용할 수 있다.
		OutClass.InStaticClass.sTest();
		
	}

}

 

예제를 한번 읽어보면 까먹어도 다시 이해할 수 있을듯 하다.

 

02. 익명 내부 클래스의 활용

지역 내부 클래스

지역 변수와 같이 메서드 내부에서 정의하여 사용하여 클래스

메서드의 호출이 끝나면 메서드에 사용된 지역변수의 유효성은 사라짐

메서드 호출 이후에도 사용해야 하는 경우가 있을 수 있으므로 지역 내부 클래스에서 사용하는 메서드의 지역 변수나 메개 변수는 final로 선언됨

(내부 클래스에서 지역변수에서 할당이 안되는 이유)

 

클래스를 쓰레드화 할때 방법 2가지

1. 쓰레드 클래스에서 extends

2. Runnable 인터페이스를 implements

 

package ch02;

class Outer2 {
	
	int outNum = 100;
	static int sNum = 200;
	
	
	Runnable getRunnable(int i) { // 클래스를 쓰레드화 할 때 필요한 run메소드를 구현할 때 사용하는 인터페이스 
		
		int num = 10;
		
		//지역 내부 클래스
//		class MyRunnable implements Runnable{
//			
//			int localNum = 1000;
//
//		@Override
//		public void run() {
//
//			//num = 200;   //에러 남. 지역변수는 상수로 바뀜
//			//i = 100;     //에러 남. 매개 변수 역시 지역변수처럼 상수로 바뀜
//			System.out.println("i =" + i); 
//			System.out.println("num = " +num);  
//			System.out.println("localNum = " +localNum);
//				
//			System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
//			System.out.println("Outter.sNum = " + Outer2.sNum + "(외부 클래스 정적 변수)");
//			
//		}
//			
//		}
//		return new MyRunnable();
		
		return new Runnable(){
			
			int localNum = 1000;

		@Override
		public void run() {

			System.out.println("i =" + i); 
			System.out.println("num = " +num);  
			System.out.println("localNum = " +localNum);
				
			System.out.println("outNum = " + outNum + "(외부 클래스 인스턴스 변수)");
			System.out.println("Outter.sNum = " + Outer2.sNum + "(외부 클래스 정적 변수)");	
			}
		};		
	}
	
	Runnable runnable = new Runnable() {

		@Override
		public void run() {

			System.out.println("Runnable class");
		}
	};
}

public class AnonymousInnerTest {

	public static void main(String[] args) {
		
		Outer2 out = new Outer2();
		Runnable runner = out.getRunnable(100);
		
		runner.run(); // getRunnable 함수가 끝났지만 다시 함수를 호출함.
		
		out.runnable.run();
	}

}

위 예제에서 3가지 형태로 지역 내부 클래스를 구현했다.

1. class MyRunnable implements Runnable (지역 내부 클래스)

2. return new Runnable() { } (익명 내부 클래스)

3. Runnable runnable = new Runnable() { } (객체 생성 후 객체의 run을 호출)

 

03. 람다식(Lambda expression)

함수형 프로그래밍과 람다식

함수의 구현과 호출만으로 프로그래밍이 수행되는 방식

자바 8부터 함수형 프로그래밍 방식을 지원하고 이를 람다식이라 함.

순수함수를 구현하고 호출하면서 외부 자료에 부수적인 영향을 주지 않도록 구현하는 방식.

(순수함수는 매개변수만을 사용하여 만드는 함수)

 

함수를 기반으로 하는 프로그래밍이고 입력받는 자료 이외에 외부 자료를 사용하지 않아 여러 자료가 동시에 수행되는 병렬처리가 가능. 함수형 프로그래밍은 자료에 독립적임을 보장합니다. 이는 동일한 자료에 대해 동일한 결과를 보장하고, 다양한 자료에 대해 같은 기능을 수행할 수 있다.

 

람다식 문법

함수에 이름이 없음(익명 함수)

( int x, int y ) -> {return x + y;}

간결하게 사용함. 이것저것 생략 가능하고 매우 코드가 짧아짐(가독성은 떨어짐)

 

package ch03;

public interface Add {
	
	
	public int add(int x, int y);
	

}
package ch03;

public class AddTest {

	public static void main(String[] args) {

		Add addL = (x,y)-> x + y; 
		//Add addL = (x,y)-> {return x + y}; 
		System.out.println(addL.add(2,3));
	}	

}

Add 인터페이스에 add를 main에서 바로 구현한다. addL에 람다식으로 바로 구현하게 되고, 잘 동작한다.

 

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

728x90
반응형
Comments