2024.05.27(월) 슈퍼코딩 부트캠프 백엔드/Spring 네이버 웹툰 인턴 Day 1 일일보고

usnim·2024년 5월 27일
0

super_coding

목록 보기
21/35

📋 TO-DO LIST

스노우 인턴 활동 [o]

5주 1일차 강의 [o]

네이버 웹툰 사수 도움 요청 업무 [o]

팀장님 지시 업무 [o]

중간/일일 업무 보고 작성 [o]

정기 팀/동기 스터디 모임 참석 및 성실도 [o]

📍 학습 내용 정리

메소드 레퍼런스

메소드 레퍼런스는 메소드를 가리키는 참조로, 람다식을 간단하게 표현할 수 있습니다.

예를 들어, Function 인터페이스를 활용하여 메소드 레퍼런스를 사용할 수 있습니다.

Function<Integer, String> intToString = String::valueOf;
String result = intToString.apply(123); // 결과: "123"

멀티 쓰레딩 프로그래밍

멀티 쓰레딩은 여러 쓰레드를 사용하여 동시에 작업을 수행하는 프로그래밍 기법입니다.

디자인 패턴

디자인 패턴은 소프트웨어 설계 문제를 해결하기 위한 재사용 가능한 해결책입니다.

예를 들어, 싱글톤 패턴은 인스턴스를 하나만 생성하는 패턴으로,
다중 쓰레드 환경에서 안전하게 인스턴스를 공유할 수 있습니다.

// 디자인 패턴: 팩토리 메소드 패턴
interface Product {
    void operation();
}

class ConcreteProduct implements Product {
    @Override
    public void operation() {
        System.out.println("ConcreteProduct operation");
    }
}

abstract class Creator {
    public abstract Product factoryMethod();
    
    public void someOperation() {
        Product product = factoryMethod();
        product.operation();
    }
}

class ConcreteCreator extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProduct();
    }
}

public class FactoryMethodPatternExample {
    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        creator.someOperation();
    }
}

자바 어노테이션

자바 어노테이션은 소스 코드에 메타데이터를 추가하는 방법으로, 컴파일러나 런타임에 정보를 제공합니다.

예를 들어, @Override 어노테이션은 메소드가 부모 클래스의 메소드를
오버라이드한다는 것을 나타냅니다.

// 자바 어노테이션 예시코드
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface Test {
    String value() default "";
}

class Example {
    @Test("Example Test")
    public void testMethod() {
        System.out.println("Testing method");
    }
}

public class AnnotationExample {
    public static void main(String[] args) throws Exception {
        Example example = new Example();
        Class<?> clazz = example.getClass();
        Test annotation = clazz.getMethod("testMethod").getAnnotation(Test.class);
        System.out.println("Annotation value: " + annotation.value());
    }
}

메타 프로그래밍

메타 프로그래밍은 프로그램이 자기 자신을 조작하거나 변형하는 프로그래밍 기법입니다.

자바에서는 리플렉션을 사용하여 런타임에 클래스 정보를 조사하거나 수정할 수 있습니다.

Class<?> clazz = MyClass.class;
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
    System.out.println(method.getName());
}

📍 일일보고

부족한 점 : 멀티 쓰레딩의 이해와 경험부족

스스로 시도해본 것들 :

멀티 쓰레드 실습

public class ThreeThreadsListFiller {
    public static void main(String[] args) {
        // 작업할 List 생성
        int listSize = 1000;
        List<Integer> list = new ArrayList<>(listSize);

        // 결과 확인
        System.out.println("List의 길이: " + list.size());
        System.out.println("List의 내용: " + list);

        // 3개의 쓰레드 생성, 업무 분담 실행
        Thread thread1 = new Thread(new ListFillerTask(list, 0));
        Thread thread2 = new Thread(new ListFillerTask(list, 1));
        Thread thread3 = new Thread(new ListFillerTask(list, 2));

        // 3개 Thread 작업 진행
        thread1.start();
        thread2.start();
        thread3.start();

        try {
            thread1.join();
            thread2.join();
            thread3.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 결과 확인
        System.out.println("List의 길이: " + list.size());
        System.out.println("List의 내용: " + list);
    }

    // 자신이 맡은 리스트 인덱스의 값을 각각 0, 1, 2로 채우는 Task 구현
    static class ListFillerTask implements Runnable {
        private List<Integer> list;
        private int startIndex;

        public ListFillerTask(List<Integer> list, int startIndex) {
            this.list = list;
            this.startIndex = startIndex;
        }

        @Override
        public void run() {
            for (int i = startIndex; i < list.size(); i += 3) {
                list.set(i, i % 3);
            }
        }
    }
}

https://github.com/jominsu0103/java_practice/tree/main/src/assignments/week1/assignment1/leaderAssignment/week3/day1

해결 내용 :

부족한점을 해결하기 위해 멀티 쓰레딩 실습을 통해 쓰레드간의 작업분담을 경험

알게된 점 :

멀티 쓰레딩의 동작방식과 쓰레드간의 협업에 대해 학습

헷갈리거나 실수한 점 :

쓰레드간의 동기화를 생각하지 못해서 예상치 못한 결과를 얻었었다. 경쟁상태를 좀 더 면밀히 볼 필요가 있다고 느꼈다.

회고 : 저번주와 이번주 첫 챕터로 자바를 좀 더 효율적으로 쓰는 방법에 대해서 학습했다.
물론 모르는 용어도 많고 그럴때 마다 공식문서를 확인하거나 구글링을 해야하는 경우도 늘었는데 성급하게 이해하지 못하고 넘어가는것 보다 조금은 느리지만 이해하고 넘어가는 경험이 중요하다는것을 항상 실습때 느끼고 있다. 다음 챕터에는 데이터 베이스에 대해 학습한다고 하니 기대된다.

profile
🤦‍♂️

0개의 댓글