내일배움캠프#7

김한준 Hanjun Kim·2023년 10월 18일
0

내일배움캠프

목록 보기
7/70

오늘 Java 문법 종합반 4~5주차 강의를 수강했다.

예정되어 있던 개인과제를 저녁에 해보려고 했지만 시간이 모자랐다.

수강 중 들으면서 나중에도 헷갈릴 만한 내용들을 내 식으로 정리 하면서 들었다.

지금은 거의 일기 식이지만, 나중에 여유가 생기면 TIL도 제대로 작성해보려고 한다.

온라인 메모장이라고 생각하고 다시 읽어보면 공부에 도움이 되지 않을까?


인터페이스를 쓰는 이유

처음에 리모컨 만들때 LGTV 전용 리모콘으로 만들면
물론 정상 동작 한다.
하지만 이 리모컨으로 SamsungTV를 조작하려고 하면 안된다. LGTV "전용" 리모컨이기 때문에.
그래서 인터페이스를 사용해서 LGTV와 SamsungTV를 TV로부터 상속받게 하고,(부모 - 자식 상속)
거기다가 리모컨 인터페이스를 implement하여 리모컨을 둘 다 조작할 수 있게 만든다.
Remote mrc = new LgTV("LGTV") 이런식으로. 생성자가 다르지만 자동형변환을 통해서!

3주차 과제

이해는 했는데, 정답 코드를 보니 private 쓰는 부분과
추상화를 하는 이유? 추상 클래스를 쓰는 이유? 실제 계산기를 생각해 보니 조금 이해가 안갔다.
이외는 생각한대로 나와서 조금 뿌듯했다ㅎ

예외처리

public class OurBadException extends Exception{
	public OurBadException(){
		super("위험한 행동 예외처리");
	}
}
private final boolean just = true;
public void Dangerous () throws OurBadException{
	if(just){
		throw new OurBadException();
	}
}

throw = 예외를 던지다 / 발생시키다
throws = method 뒤에
throw = 메서드 안에서 예외 객체를 던질 때
일반 메서드의 return처럼 throw 아래 구문은 실행되지 않고, throw와 함께 메서드 종료
그냥 호출하면 안되고, try catch로 감싸주고 finally는 생략 가능.
자바는 예외와 예외를 연결할 수 있다

제네릭

자바스크립트와 파이썬은 따로 타입을 구분해서 받지 않는다 -> 코드의 안정성이 떨어진다 -> 자바스크립트는 결국 타입스크립트를 채용했다.
제네릭 문법 : <T, U, V...> <- 이거 템플릿 아닌가?
1. 제네릭은 클래스 또는 메서드에 사용 가능
2. <> 안에 들어가야 할 타입을 명시
3. T로 해야함
4. 다수의 타입변수를 지정할 수 있다
5. 다형성의 관계는 그대로 적용된다
6. 와일드 카드를 통해 제한할 수 있다

: T와 그 자손들만 사용 가능 : T와 그 조상들만 사용 가능 : 제한 없음
  1. 제네릭 메서드도 선언 가능
  2. 객체의 static 멤버에 사용 할 수 없다 - 타입 변수는 인스턴스 변수로 간주되고, 모든 객체에 동일하게 동작해야하는 static의 특성상 제네릭을 사용 할 수 없다
    단, 제네릭 메서드는 가능

컬렉션

Set(집합) - 중복을 허용하지 않고, 순서 x <---> List

  • 상속 다시 정리
    extends는 일반 클래스와 추상화 클래스 상속 / implements는 interface 상속
    class가 class or abstract를 상속받을땐 extends / class가 interface를 상속받을땐 implements
    interface가 class를 상속받을땐 extends /interface가 interface를 상속받을땐 extends

Wrapper 클래스

간단하게 말하면 Integer, String 같은 대문자 클래스 말하는것
성능상의 이슈때문에 Wrapper를 쓰진 않고, 원시값 그대로 사용하는 것 뿐
추상적인 기능이 필요할 때 객체화 시켜서 씀

4주차 숙제

구현은 되었는데 return this < 이거는 왜 넣은걸까?

프로세스와 쓰레드

프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
쓰레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위
ex) 카카오톡, 크롬 : 프로세스 / 일꾼 : 쓰레드

멀티 쓰레드

메인 쓰레드 : 메인 클래스 만들면 프로세스와 함께 실행되는 친구, 별다른 코드 없다면 싱글 쓰레드 방식
멀티 쓰레드 : 하나의 프로세스 안에서 자원을 공유하면서 작업을 처리하는 방식.(비동기방식)
단, 자원을 서로 공유하려고 하는 충돌이 발생할 수 있다.(교착상태 Dead-Lock)

멀티 쓰레드 구현

public class TestRunnable implements Runnable{ 			<- interface
	public void run(){
		// 쓰레드에서 수행할 작업 정의!
		
	}
}

메인에서는
Thread thread = new Thread(run);
thread.start();

  • thread.start() 위에 new Thread(run) 을 넣어 주는 이유
  • Runnable = 실행 대기라는 뜻
  • run을 넣고 Runnable을 통해 안의 로직 구현 가능?

데몬 쓰레드

= 가비지 컬렉터같은 낮은 우선순위를 가진 쓰레드
Runnable demon 으로 구현 하면 됨
<--> 사용자 쓰레드
= 메인 쓰레드같은 높은 우선순위를 가진 쓰레드
우선순위는 thread.setPriority를 통해 정해줄 수 있다

쓰레드 그룹

쓰레드는 그룹을 지정해 줘야 하는데, 디폴트값은 메인 쓰레드이다
ThreadGroup group1 = new ThreadGroup("Group1");
Thread thread1 = new Thread(group1, task, "Thread 1");
interrupt : 일시정지 상태인 쓰레드를 실행대기 상태로 만든다
그룹을 쓰는 이유 : 여러 쓰레드를 한번에 제어하기 위해서

쓰레드 제어

  • sleep
    static 이기 때문에, 어떤 객체를 지정하는게 아니라 어떤 흐름 안에서 쓰레드 자체를 재운다
  • 특정 쓰레드.sleep은 의미가 없다.
    sleep 자체가 static 메서드이기 때문에 어차피 메인 쓰레드가 잠자게 된다
  • interrupt
    실행상태 전환
    예외처리 필수!
    interrupt를 만나면 다시 실행되기 때문에
    InterruptedException이 발생할 수 있다
    sleep 도중에 interrupt를 통해 해당 쓰레드를 깨우면,try를 실행하지 않고 catch로 이동한다

  • join
    thread.join()
    정해진 시간동안 지정한 쓰레드가 작업하는 것을 기다린다
    -> 시간을 지정하지 않으면 지정한 쓰레드의 작업이 끝날때까지 기다린다(main 또는 다른 쓰레드가)

  • yield
    남은 시간을 다음 쓰레드에게 양보하고 쓰레드 자신은 실행대기 상태가 됨
    실행 도중 인터럽트를 만나서 catch 안에 yield를 넣어놓는다면, thread1은 실행대기 상태로 변경되면서 남은 시간은 thread2에게 양보한다

  • synchronized
    한 쓰레드가 진행중인 작업을 다른 쓰레드가 침범하지 못하게 막음(쓰레드 동기화)
    다른 쓰레드의 침범을 막아야 하는 코드들을 '임계영역'으로 설정
    예)


public synchronized void asyncSum(){

}
synchronized(해당 객체의 참조변수){

}

예) 사과가 10개 있는데, 쓰레드 3개가 돌려서 하나씩 먹는다고 가정하면
0개 되었을 땐 먹으면 안되는데 이미 와서 먹는걸 대기중이기 때문에 -2가 된다
먹는 영역을 synchronized로 묶어주면 정상작동한다

  • wait, notify
    wait : 실행 중이던 쓰레드는 해당 객체의 대기실에서 통지를 기다립니다
    notify : 해당 객체의 대기실에 있는 모든 쓰레드 중에서 임의의 쓰레드만 통지를 받습니다
    병목현상 주의. 서로 대기하는 상황이 발생한다
    -> 그러므로 누구를 깨워주는지 명시가 필요하다

  • Lock
    synchronized 블럭으로 동기화하면 자동적으로 Lock이 걸리고 풀리지만, 같은 메서드 내에서만 Lock을 걸 수 있다
    이런 제약을 해결하기 위해 Lock 클래스를 사용한다

  • Condition
    wait & notify의 문제점인 waiting pool 내 쓰레드를 구분하지 못하는 걸 해결함
    ReentrantLock과 함께 사용한다
    일단 메서드 시작하면 Lock으로 잠그고, contidion1.await()을 기다리게 하고 condition2.signal()로 깨운다.

람다

익명함수를 지칭하는 말. 이름이 없는 함수
(매개변수)->{로직}

static 붙이는 이유와 this 메서드

?5-11 모던자바

함수를 파라미터로 받을 땐 함수형 interface를 사용한다(interface는 타입 역할을 할 수 있다-리모컨 예제)
함수형 interface : 추상 메소드를 딱 하나만 가지고 있음

Car::hasTicket 같은 함수는 람다로 대체 가능

5-12 모던자바_stream

자료구조들의 흐름을 객체로 제공해준다는 말, 그 흐름동안 사용할 수 있는 메서드들을 api로 제공
1. 원본 데이터를 변경하지 않는다
2. 일회용이다
구현
1. 스트림 객체를 받는다
2. 해당 객체는 자료구조의 모든 원소가 있다
3. filter, map과 같은 이미 구현된 메소드도 있다
-> .stream : 스트림 받아오기
-> filter(가공) : 조건에 맞는 것만 반환
-> .toList() : 스트림 결과 만들기
-> map : 모든 요소를 가공해서 반환
-> forEach : 하나씩 돌면서 함수를 실행해준다

?5-13 모던자바_null

예) 데이터가 없을땐 null을 반환하게 되면, null을 참조하게 되고, NullpointException이 발생해서 오류가 난다
모든 아이디어를 발전시킨게 java.util.Optional객체
Optional
1. 값이 없으면 Optional.empty();
2. 값이 있으면 Optional.of(new Car());
3. 값이 있을수도 없을수도 Optional.ofNullable(getCaFromDB));
4. Optional 객체 사용하기(값 받아오기)
-> Optional carName = getCarNameFromDB();
orElse()를 통해 값을 받는다
String realCarName = carName.orElse("NoCar");
String carname = getCarNameFromDB().orElse("NoCar");
orElseGet(값 받아오기), orElseThrow(예외)

profile
개발이 하고싶은 개발지망생

0개의 댓글