[새싹] 현대IT&E 231020 기록 - JAVA 15장

최정윤·2023년 10월 20일
0

새싹

목록 보기
4/67

이클립스 콘솔 레이아웃 초기화하기

https://freestyle385.tistory.com/10

macOS에서 Eclipse 사용시 한글 씹힘 문제 해결

https://seolhee2750.tistory.com/209

12장. 추상클래스와 인터페이스

12.2 인터페이스

12.2.1 인터페이스의 정의와 특징

  • 인터페이스는 내부의 모든 필드가 public static final로 정의되고, static과 default 메서드 이외의 모든 메서드는 public abtract로 정의된 객체지향 프로그래밍 요소다.
  • class 키워드 대신 Interface 키워드 사용

12.2.2 인터페이스의 상속

  • 클래스 - 클래스 상속 => extends 키워드 사용
  • 클래스 - 인터페이스 상속 => implements 키워드 사용
  • 상속에 있어서 인터페이스의 가장 큰 특징은 다중 상속이 가능하다는 것!!

12.2.3 인터페이스 타입의 객체 생성 방법

CreateObjectOfInterface_2.java

package pt4;

interface A{
	int a = 3;
	void abc();
}

public class CreateObjectOfInterface_2 {
	public static void main(String[] args) {
		// 객체 생성
		A a1 = new A() {
			public void abc() {
				System.out.println("방법 2. 익명 이너 클래스를 이용한 객체 생성");
			}
		};
		A a2 = new A() {
			public void abc() {
				System.out.println("방법 2. 익명 이너 클래스를 이용한 객체 생성");
			}
		};
		// 메서드 호출
		a1.abc();
		a2.abc();
	}
}

12.2.5 디폴트 메서드와 정적 메서드

  • 자바 8부터 가능해졌다.
  • 인터페이스 내에 완성된 메서드인 디폴트 메서드가 포함될 수 있다.
  • 디폴트 메서드는 중괄호 사용이 가능하다.

13장. 이너 클래스와 이너 인터페이스

13.1 이너 클래스

  • 클래스 내부에 포함되는 이너 클래스는 인스턴스 멤버 이너 클래스 (class B{}), 정적 멤버 이너 클래스 (static class C{}), 지역 이너 클래스 (void abc(){class D{}})로 나뉜다.

13.1.1 인스턴스 멤버 이너 클래스

인스턴스 멤버 이너 클래스의 객체 생성 바업
아우터 크래스 아우터 클래스 참조 변수 = new 아우터 클래스();
아우터 클래스.이너 클래스 이너 클래스 참조 변수 = 아우터 클래스 참조 변수 .new 이너 클래스();

class A {
	class B{
    }
}
A a = new A();
A.B b = a.new B();

13.1.2 정적 멤버 이너 클래스

  • 정적 멤버 이너 클래스는 이너 클래스 앞에 static 키워드가 포함된 이너 클래스이다.
  • 정적 메서드와 동일하게 아우터 클래스의 정적 멤버에만 접근할 수 있는데, 이너 클래스의 특정이 아닌 정적 특성이다.
  • 아우터 클래스의 객체를 생성하지 않아도 정적 이너 클래스의 객체를 생성해 사용할 수 있어야 하므로 아우터 클래스의 멤버 중객체 생성 없이 바로 사용할 수 있는 정적 멤버만 정적 이너 클래스 내부에서 사용할 수 있는 것이다.

CreateObjectAndAccessMember.java

package pt5;

class A {
	public int a = 3;
	protected int b = 4;
	int c = 5;
	private int d = 6;
	void abc() {
		System.out.println("A 클래스 메서드 abc()");
	}
	// 인스턴스 이너 클래스
	class B{
		void bcd(){
			// 아우터 클래스의 필드 사용
			System.out.println(a);
			System.out.println(b);
			System.out.println(c);
			System.out.println(d);
			// 아우터 클래스의 메서드 호출
			abc();
		}
	}
	public class CreateObjectAndAccessMember {
		public static void main(String[] args) {
			// 아우터 클래스 객체 생성
			A a = new A();
			// 멤버 사용
			A.B b = a.new B();
			b.bcd();
		}
	}
}

13.1.3 지역 이너 클래스

  • 지역 이너 클래스는 클래스의 멤버가 아닌 메서드 내에서 정의되는 클래스다.
  • 지역 변수처럼 정의된 메서드 내부에서만 사용할 수 있으므로 일반적으로 지역 이너 클래스는 선언 이후 바로 객체를 생성해 사용하며, 메서드가 호출될 때만 메모리에 로딩된다.
  • 지역 이너 클래스는 정적 클래스로 지정할 수 없다.

AccessMemberAndLocalVariable.java

package pt6;

class A {
	int a = 3;
	void abc() {
		int b = 5; // 지역 변수
		// 지역 이너 클래스
		class B {
			void bcd() {
				System.out.println(a);
				System.out.println(b);
				a = 5;
				// b = 7;
			}
		}
		B bb = new B();
		bb.bcd();
	}
}

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

13.2 익명 이너 클래스

13.2.1 익명 이너 클래스의 정의와 특징

  • 익명 이너 클래스: 이름을 알 수 없는 이너 클래스

AnnonymousClass_1.java

package pt7;

class A {
	C c = new B();
	void abc() {
		c.bcd();
	}
	class B implements C {
		public void bcd() {
			System.out.println("인스턴스 이너 클래스");
		}
	}
}

interface C {
	public abstract void bcd();
}

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

13.2.2 익명 이너 클래스를 활용한 인터페이스 타입의 입력매개변수 전달

AnnonymousClass_3.java

package pt8;

interface A {
	public abstract void abc();
}

// 자식 클래스 직접 생성
class B implements A {
	public void abc() {
		System.out.println("입력매개변수 전달");
	}
 }

class C {
	void cde(A a) {
		a.abc();
	}
}

public class AnnonymousClass_3 {
	public static void main(String[] args) {
		C c = new C();
		// 방법 1. 클래스명 O + 참조 변수명 O
		A a = new B();
		c.cde(a);
		// 방법 2. 클래스명 O + 참조 변수명 X
		c.cde(new B());

	}

}

AnnonymousClass_4.java

package pt9;

interface A {
	public abstract void abc();
}

class C {
	void cde(A a) {
		a.abc();
	}
}

public class AnnonymousClass_4 {
	public static void main(String[] args) {
		C c = new C();
		
		A a = new A() {
			public void abc() {
				System.out.println("입력매개변수 전달");
			}
		};
		c.cde(a);
		c.cde(new A(){
			public void abc() {
				System.out.println("입력개변수 전");
			}
		});
	}

}

13.3 이너 인터페이스

13.3.2 이벤트 처리 기능 작성하기

ButtonAPIExample.java

package pt10;

class Button{
	OnClickListener ocl;
	void setOnClickListener (OnClickListener ocl) {
		this.ocl = ocl;
	}
	interface OnClickListener {
		public abstract void onClick();
	}
	void onClick () {
		ocl.onClick();
	}
}

public class ButtonAPIExample {
	public static void main(String[] args) {
		// 개발자 1. 클릭하면 음악 재생
		Button btn1 = new Button();
		btn1.setOnClickListener(new Button.OnClickListener() {
			@Override
			public void onClick() {
				System.out.println("개발자 1: 음악 재생");
			}
		});
		btn1.onClick();
		
		// 개발자 2. 클릭하면 네이버 접속
		Button btn2 = new Button();
		btn2.setOnClickListener(new Button.OnClickListener() {
			@Override
			public void onClick() {
				System.out.println("개발자 2: 네이버 접속");
			}
		});
		btn2.onClick();
	}

}

14장. 예외 처리

  • 다양하게 발생하는 오류 중 개발자가 해결할 수 있는 오류를 '예외', 이러한 예외가 발생했을 때 이를 적절히 처리하는 것을 '예외 처리'라고 한다.

14.1 예외

CheckedException.java

package exception;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

class A implements Cloneable {
	protected Object clone() throws CloneNotSupportedException {
		return super.clone();
	}
}

public class CheckedException {
	public static void main(String[] args) throws InterruptedException, ClassNotFoundException, IOException, CloneNotSupportedException {
		Thread.sleep(1000);
		
		Class cls = Class.forName("java.lang.Object");
		
		InputStreamReader in = new InputStreamReader(System.in);
		in.read();
		
		FileInputStream fis = new FileInputStream("text.txt");
		
		A a1 = new A();
		A a2 = (A)a1.clone();
	}
}

ExceptionTest1.java

package exception;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;

public class ExceptionTest1 {

	public static void main(String[] args) throws FileNotFoundException {
		InputStreamReader isr = new InputStreamReader(System.in);
		FileInputStream fis = new FileInputStream("test.txt");

	}

}

14.1.4 실행 예외

UncheckedException.java

package exception;

class A{}
class B extends A{}

public class UncheckedException {
	public static void main(String[] args) {
		System.out.println(3 / 0);
		
		A a = new A();
		B b = (B)a;
		
		int[] array = {1, 2, 3};
		System.out.println(array[3]);
		
		int num = Integer.parseInt("10!");
		
		String str = null;
		System.out.println(str.charAt(2));
	}

}

14.2 예외 처리

TryCatchFinally.java

package exception;

public class TryCatchFinally {
	public static void main(String[] args) {
		try {
			System.out.println(3 / 0);
			System.out.println("프로그램 종료");
		}
		catch(ArithmeticException e) {
			System.out.println("숫자는 0으로 나눌 수 없습니다.");
			System.out.println("프로그램 종료");
		}
		
		try {
			System.out.println(3 / 0);
		}
		catch(ArithmeticException e) {
			System.out.println("숫자는 0으로 나눌 수 없습니다.");
		}
		finally {
			System.out.println("프로그램 종료");
		}
	}
}

14.4 사용자 정의 예외 크래스

14.4.1 사용자 정의 예외 클래스 생성 방법

CreateUserException.java

package exception;

 // 1. 사용자 일반 예외
class MyException extends Exception {
	public MyException() {
		super();
	}
	public MyException(String message) {
		super(message);
	}
}

// 2. 사용자 실행 예외
class MyRTException extends RuntimeException {
	public MyRTException() {
		super();
	}
	public MyRTException(String message) {
		syoer(message);
	}
}

class A {
	// 3. 사용자 정의 예외 객체 생성
	MyException me1 = new MyException();
	MyException me2 = new MyException("예외 메시지: MyException");
	
	MyRTException mre1 = new MyRTException();
	MyRTException mre2 = new MyRTException("예외 메시지: MyRTException");
	
	// 4. 예외 던지기(throw): 던진 시점에서 예외 발생
	void abc_1(int num) {
		try {
			if(num > 70)
				System.out.println("정상 작동");
			else
				throw me1;
		} catch (MyException e) {
			System.out.println("예외 처리 1");
		}
	}
	void bcd_1() {
		abc_1(65);
	}
	void abc_2(int num) throws MyException {
		if(num > 70)
			System.out.println("정상 작동");
		else
			throw me1;
	}
	void bcd_2() {
		try {
			abc_2(65);
		} catch (MyException e) {
			System.out.println("예외 처리 2");
		}
	}
}

public class CreateUserException {
	public static void main(String[] args) {
		A a = new A();
		a.bcd_1();
		a.bcd_2();
	}
}

14.4.3 사용자 정의 예외 클래스의 사용 예

UserExceptionExample.java

package exception;

class MinusException extends Exception {
	public MinusException() {
		super();
	}
	public MinusException(String message) {
		super(message);
	}
}

class OverException extends Exception {
	public OverException() {
		super();
	}
	public OverException(String message) {
		super(message);
	}
}

class AAAAA {
	void checkScore(int score) throws MinusException, OverException{
		if(score < 0) {
			throw new MinusException("예외 발생: 음숫값 입력");
		}
		else if (score > 100)
			throw new OverException("예외 발생: 100점 초과");
		else
			System.out.println("정상적인 값입니다.");
	}
}

public class UserExceptionExample {
	public static void main(String[] args) {
		AAAAA a = new AAAAA();
		try {
			a.checkScore(85);
			a.checkScore(150);
		} catch (MinusException | OverException e) {
			System.out.println(e.getMessage());
		}
	}
}

ExceptionTest3.java

package exception;

public class ExceptionTest3 {

	public static void main(String[] args) {
		try {
			System.out.println("a() 호출전");
			a();
			System.out.println("a() 호출후");
		} catch (Exception e) {
			System.out.println("메인 메서드의 catch블럭");
			e.printStackTrace();
		} finally {
			System.out.println("메인 메서드의 finally블럭");
		}	
		System.out.println("수행완료");
	}
	
	public static void a() {
		try {
			System.out.println("b() 호출");
			b();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	public static void b() {
		try {
			System.out.println("b() 호출");
		} catch (Exception e) {
			// TODO: handle exception
		}
	}

}

15장. 쓰레드

15.1 프로그램, 프로세스, 쓰레드

15.1.2 쓰레드의 개념

  • 프로세스만 CPU를 사용할 수 있다.
  • 실제 CPU를 사용하는 것은 프로세스 내부의 쓰레드이다.
  • 쓰레드: CPU를 사용하는 최소 단위

15.1.5 쓰레드는 정말 동시에 수행될까?

  • 쓰레드는 CPU를 사용하는 최소 단위
    • ex) 2개의 쓰레드가 있다면 2개의 작업이 동시에 수행될 것이다.

동시성

  • 동시성: 처리할 작업의 수가 CPU의 코어 수보다 많을 때
    • ex) CPU의 코어는 1개인데, 동시에 처리해야 할 작업이 2개일 때
  • CPU는 각 작업 쓰레드의 요청 작업을 번갈아가면서 실행한다.
  • 매우 짧은 간격으로 교차 실행하기 때문에 사용자에게는 두 작업이 동시에 실행되는 것처럼 보인다.
  • 동시성은 두 작업이 동시에 실행되는 것이 아니라 동시에 실행되는 것처럼 보이는 방식이다.

병렬성

  • 병렬성: CPU의 코어 수가 작업 수보다 많을 때 각각의 작업을 각가의 코어에 할당해 동시에 실행할 수 있어 동시에 작업이 수행되는것

CreateAndStartThread_M1C2.java

package thread;

class SMIFileThread extends Thread {
	@Override
	public void run() {
		String[] strArray = {"하나", "둘", "셋", "넷", "다섯"};
		try {Thread.sleep(10);} catch (InterruptedException e ) {}
		for (int i = 0; i <strArray.length; i++) {
			System.out.println(" - (자막 번호) " + strArray[i]);
			try {Thread.sleep(200);} catch (InterruptedException e) {}
		}
	}

}

class VideoFileThread extends Thread {
	@Override
	public void run() {
		int[] intArray = {1, 2, 3, 4, 5};
		
		for (int i = 0; i< intArray.length; i++) {
			System.out.println("(비디오 프레임) " + intArray[i]);
			try {Thread.sleep(200);} catch (InterruptedException e) {}
		}
	}
}

public class CreateAndStartThread_M1C2 {
	public static void main(String[] args) {
		Thread smiFileThread = new SMIFileThread();
		smiFileThread.start();
		
		Thread videoFileThread = new VideoFileThread();
		videoFileThread.start();
	}

}
profile
개발 기록장

0개의 댓글