ThinkAboutSoftware / OnlineSelfCodingGroup

Online coding and study group at every Saturday at 10:30 am.
MIT License
17 stars 4 forks source link

21th online meetup, 2021-04-10 #56

Closed jongfeel closed 3 years ago

jongfeel commented 3 years ago

https://meet.google.com/jyx-mxnq-kpk

참여 방법:

Assignees에 자신의 github 계정을 self로 추가 2시간 분량의 할 내용에 대해 댓글 작성 (최소 모임 시작 전까지) 빛의 속도 혹은 (주말, 휴일 포함) 최소 3일 내에 구글 캘린더 등록 메일 확인 모임 시간에 각자 개발 관련된 공부 진행

모임 끝난 후 공부한 내용 정리 & 링크 추가 => 최소 다음 모각코 전까지 확인 가능해야 함.

주의: 회사일 혹은 마감 기한 임박한 일 처리의 경우는 최대한 자제해 주세요. 주말 아침에 일하면 우울하니까요. ㅜㅜ

Youtube 음악 재생목록:

음악 취향 강요 공유를 위해 재생목록을 공유합니다. 자유롭게 추가해 주세요. https://www.youtube.com/playlist?list=PLBFc2T4S7JnvZrV92zSlOfqeYHj7-qJfB&jct=hkFSXgrr2X-4yldTm5iMtpqnGcjKRQ

hi-hyein commented 3 years ago

계획

notion

Joseph-Cha commented 3 years ago

독서

소프트웨어스펙의 모든 것

결과

링크

wjrmffldrhrl commented 3 years ago

코딩테스트 준비

풀이

package hacker;

import java.util.Scanner;
import java.util.Stack;

public class JavaStack {
    public static void main(String[] argh) {
        Scanner sc = new Scanner(System.in);

        while (sc.hasNext()) {
            String input = sc.next();
            System.out.println(line(input));
        }

    }

    private static boolean line(String input) {
        Stack<Character> stack = new Stack<>();
        boolean correct = true;

        forLoop:
        for (int i = 0; i < input.length(); i++) {
            char bracket = input.charAt(i);

            if (bracket == '{' || bracket == '(' || bracket == '[') {
                stack.push(bracket);
            } else {

                if (stack.size() == 0) {
                    correct = false;
                    break;
                }

                char leftBracket = stack.pop();

                switch (leftBracket) {
                    case '{':
                        if (bracket != '}') {
                            correct = false;
                            break forLoop;
                        }
                        break;
                    case '(':
                        if (bracket != ')') {
                            correct = false;
                            break forLoop;
                        }
                        break;
                    case '[':
                        if (bracket != ']') {
                            correct = false;
                            break forLoop;
                        }
                        break;
                }
            }
        }

        if (stack.size() > 0) {
            return false;
        }
        return correct;
    }
}

만약 다 풀면

jongfeel commented 3 years ago

IBM QX로 배우는 양자 컴퓨팅

2장 큐비트, 45 ~ 64 페이지 읽기


이후 아래 github 페이지에 정리 (이번주 내로) https://github.com/jongfeel/QuantumComputing/tree/main/MasteringQuantumComputingWithIBMQX

wjrmffldrhrl commented 3 years ago

계획

@hi-hyein

제가 이펙티브 자바에서 읽은 Enum 관련 내용 공유합니다!


6장 열거 타입과 애너테이션

Item 34

int 상수 대신 열거 타입을 사용하라

정수형 상수 열거 패턴

public static final int APPLE_FUJI          = 0;
public static final int APPLE_PIPPIN        = 1;
public static final int APPLE_GRANNY_SMITH  = 2;

public static final int ORANGE_NAVEL        = 0;
public static final int ORANGE_TEMPLE       = 1;
public static final int ORANGE_BLOOD        = 2;

정수나 문자열 열거 패턴을 이용하게 된다면 해당 코드는 프로그래머가 그대로 하드코딩하게 만들고, 이러한 하드코딩된 열거 타입은 오타가 있어도 컴파일러는 확인할 길이 없으니 자연스럽게 런타임 버그가 생기며 문자열 비교에 따른 성능 저하 역시 당연한 결과다.

이러한 열거 패턴의 대안이 바로 열거 타입이다.

간단한 열거 타입

public enum Apple { FUJI, PIPPIN, GRANNY_SMITH}
public enum Orange { NAVEL, TEMPLE, BLOOD }

데이터와 메서드를 갖는 열거 타입

public enum Planet {
    MERCURY(3.302e+23, 2.439e6),
    VENUS(4.869e+24, 6.052e6),
    EARTH(5.975e+24, 6.378e6),
    MARS(6.419+23, 3.393e6),
    JUPITER(1.899+27, 7.149e7),
    SATURN(5.685+26, 6.027e7),
    URANUS(8.683+25, 2.556e7),
    NEPTUNE(1.024+26, 2.477e7);

    private final double mass;
    private final double radius;
    private final double surfaceGravity;

    private static final double G = 6.67300E-11;

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
        surfaceGravity = G * mass / (radius * radius);
    }

    public double mass() { return mass; }
    public double radius() { return radius; }
    public double surfaceGravity() { return surfaceGravity; }

    public double surfaceWeight(double mass) {
        return mass * surfaceGravity; // F = ma
    }

}

열거 타입 상수 각각을 특정 데이터와 연결지으려면 생성자에서 데이터를 받아 인스턴스 필드에 저장하면 된다.


일부 내용만 가져온거라 부족한 부분이 있을 수 있습니다. ㅎㅎㅎ

hi-hyein commented 3 years ago

@wjrmffldrhrl 승현님 감사합니다 꼭 잘 이해해볼게요 ☺️ ☺ ☺ ☺

Joseph-Cha commented 3 years ago

자바의 enum은 처음 봤는데 확실히 C#과는 다른 느낌이네요 생성자에 메서드까지 담을 수 있는게 신기합니다ㅎㅎ

wjrmffldrhrl commented 3 years ago

자바의 enum은 처음 봤는데 확실히 C#과는 다른 느낌이네요 생성자에 메서드까지 담을 수 있는게 신기합니다ㅎㅎ

@Joseph-Cha 그리고 저 상태에서 오버라이딩도 가능하더라고요.

예를 들어 해왕성의 surfaceWeight 계산을 변경하고 싶으면 (그럴 일은 없겠지만) 아래와 같이 수행할 수 있습니다.

public enum Planet {
    MERCURY(3.302e+23, 2.439e6),
    VENUS(4.869e+24, 6.052e6),
    EARTH(5.975e+24, 6.378e6),
    MARS(6.419+23, 3.393e6),
    JUPITER(1.899+27, 7.149e7),
    SATURN(5.685+26, 6.027e7),
    URANUS(8.683+25, 2.556e7),
    // NEPTUNE의 surfaceWeight는 다른 행성과 계산식이 달라진다
    NEPTUNE(1.024+26, 2.477e7) {
        @Override
        public double surfaceWeight(double mass) {

            return (mass + 1) * surfaceGravity();
        }
    };

    private final double mass;
    private final double radius;
    private final double surfaceGravity;

    private static final double G = 6.67300E-11;

    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
        surfaceGravity = G * mass / (radius * radius);
    }

    public double mass() { return mass; }
    public double radius() { return radius; }
    public double surfaceGravity() { return surfaceGravity; }

    public double surfaceWeight(double mass) {
        return mass * surfaceGravity; // F = ma
    }

}
Joseph-Cha commented 3 years ago

오버라이드도 C#에서 사용하는 것과는 또 다른 의미인 것 같네요 ㅎㅎ C#에서 오버라이드는 부모 클래스에서 정의한 메서드를 자식이 다시 재정의해서 사용하는 의미로 사용하는데 여기서는 먼가 오버로딩(?) 같은 느낌이랄까요?(물론 C#에서 오버로딩은 매개변수를 달리해서 같은 이름을 가진 메서드를 중복해서 사용하는걸 뜻해서 좀 다른긴 합니다만!) 여튼 덕분에 자바 스타일 속성을 구현하는 것도 보고 여러가지 배워가네요😁