[JAVA 백엔드 스터디] 2회차

minhyeok·2023년 2월 6일
0
post-thumbnail

학습 내용

  • 입출력
  • 변수
  • 연산자
  • 형변환
  • 조건문

예제 풀이

Ex1) [내 이름 출력하기] - 입출력

import java.util.Scanner;
public class ex1 {
    public static void main(String[] args){
        Scanner scanner =new Scanner(System.in);

        System.out.print("이름을 입력하세요.");
        String str = scanner.nextLine();

        System.out.println("입력하신 이름은 " + str + " 입니다.");
    }
}

scanner 객체를 생성하여 String str 변수에 nextLine() 으로 사용자로부터 입력을 받고 출력하였다.


Ex2) [아이유 프로필 출력하기] - 변수

public class ex2 {
    public static void main(String[] args){
        String str = "아이유";
        int age = 30;
        boolean stu = true;
        double weight = 40.5;
        long money = 10000000000L;
        System.out.println("이름 : "+str+" ");
        System.out.println("나이 : "+age+" ");
        System.out.println("대학생인가요? : "+stu+" ");
        System.out.println("몸무게 : "+weight+" ");
        System.out.println("재산 : "+money+" ");
    }
}


이름은 String
나이는 int
참 거짓은 boolean
몸무게는 double
재산은 long

여기서, println 구문에서 변수와 일반 문자열을 같이 출력하는 방법을 알게 되었다.
또한 long 변수형에서는 끝에 L 을 꼭 넣어서 구분해주어야한다.


Ex3) [((10 + 5) x 3) ÷ 5의 값을 7로 나눈 나머지를 구하시오.] - 연산자


Ex4) [++ , --] - 연산자


8
5
3
5
8
6
2
5
으로 출력될 것이다.
위의 네줄과 아래의 네줄의 출력이 다른 이유는, a 와 d 에서는 전위형 이므로 값이 참조되기 전에 증가 (또는 감소)시킨다.
b와 c 에서는 후위형 이므로 참조된 후에 증가(또는 감소)하므로, 위와 같은 결과가 나올 것이라고 예측하였다.


Ex5) [보너스 3등분하기] - 형변환

import java.util.Scanner;
public class ex3 {
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);

        System.out.print("보너스 금액을 입력하세요.");
        int s = scanner.nextInt();

        System.out.println("3등분된 보너스 금액은  " + (double)s/3 + "원 입니다.");
    }
}

s 라는 변수는 int 형이다. 거기에 입력을 받았기 때문에 출력을 할때도 소수점이 출력되지 않는 정수형으로 출력이 되어야 하지만, (double) 을 통해 형변환을 하여 소수점이 출력되도록 하였다.


Ex6) [이게 3의 배수 일까요?] - 조건문

import java.util.Scanner;
public class ex4 {
    public static void main(String[] args) {

        int a = 0;

        System.out.print("3의 배수인지 판단하고 싶은 숫자를 입력하세요.");
        Scanner scanner = new Scanner(System.in);
        a = scanner.nextInt();

        if (a % 3 == 0) {
            System.out.print("3의 배수입니다.");
        } else {
            System.out.println("3의 배수가 아닙니다.");
        }
    }
}

a라는 변수에 숫자를 입력받고, 조건문을 통해 3의 배수인지 아닌지를 판별하도록 하였다.
a % 3 이라는 조건은 a 를 3으로 나누었을 때의 나머지를 반환한다.
따라서 비교연산자를 이용하여 그 값이 0 이라면 3의 배수이고, 아니라면 3의 배수가 아닌 것이다.


2회차 미션

  • JSCODE 학교의 시험 채점기
    아래와 같이 작동하도록 코드를 작성해보자.
몇 기인지 입력해주세요.
3
HTML 과목 점수를 입력해주세요.
60
CSS 과목 점수를 입력해주세요. 
80
Javascript 과목 점수를 입력해주세요. 
65
불합격입니다.
전체 과목 중 최고점은 80점입니다.
전체 과목 중 최저점은 60점입니다.
전체 과목의 평균은 68.33333333333333점입니다.
몇 기인지 입력해주세요.
2
HTML 과목 점수를 입력해주세요.
63
CSS 과목 점수를 입력해주세요. 
82
Javascript 과목 점수를 입력해주세요. 
68
합격입니다.
전체 과목 중 최고점은 82점입니다.
전체 과목 중 최저점은 63점입니다.
전체 과목의 평균은 71.0점입니다.
몇 기인지 입력해주세요.
3
HTML 과목 점수를 입력해주세요.
100
CSS 과목 점수를 입력해주세요.
100
Javascript 과목 점수를 입력해주세요.
0
합격입니다.
전체 과목 중 최고점은 100점입니다.
전체 과목 중 최저점은 0점입니다.
전체 과목의 평균은 66.66666666666667점입니다.
  • JSCODE 1~3기가 시험을 봤다. 1, 2기는 평균 점수가 60점 이상이어야 합격이다. 3기는 평균 점수가 70점 이상이어야 합격이다. 다만, 100점 과목이 2개 이상일 경우 평균 점수와 상관없이 합격이다.
    • 합격일 경우 합격입니다.라는 문구를 출력해야 한다.
    • 불합격일 경우 불합격입니다.라는 문구를 출력해야 한다.

문제 풀이

  • 조건 확인
    변수 : 기수, 세 과목의 점수, 세 과목의 평균, 최고점, 최저점
    1,2 기는 평균 점수가 60점만 넘으면 된다.
    3기에서는 평균 점수가 70점 이상이어야 한다. 하지만 100 점 과목이 두 개 이상인 경우 합격이다.
    올바른 기수 입력, 조건문을 이용하여 기수에 따른 평균 계산
    최고점 최저점 출력
    전체 과목 평균에서의 형변환
  • 풀이 과정
    1,2 기에서도 100 점 과목이 두 개 이상인 경우 합격으로 봐야 하는 줄 알고 코드가 길어졌었다. 하지만 100점이 2개 이고, 하나가 0점 이기만 해도 평균이 60점 이상이 되기 때문에 고려할 필요가 없었다..
    따라서 3기에서만 100점 과목이 2개 이상인 경우만 고려해주었다.
    또한 , 그 경우에 최고점과 최저점은 100점으로 출력되어야 하는 부분이 조금 고민을 하였다.
    주석처리한 부분이 고민의 과정이였다. 저렇게 할 경우 합격은 표시 되지만 최저점이 100점이 아닌 경우가 되버린다.
    따라서 그냥 코드가 좀 길어지더라도 html , css , javascript 중 2개의 점수가 100점인 경우 총 세 경우를 다 나누어서 최고점과 최저점을 각각 100점을 맞은 과목의 점수를 출력하도록 하였다.
    이 부분은 조금 더 센스있게 max 와 min 으로 표시 할 수 있을까 고민이 많이 되었던 부분이다. max 와 min 만이 아닌 mid 을 추가하여 최고점을 max, 최저점을 mid 로 출력하는 방법도 있었지만 불필요한 과정이라 생각되어 이렇게 코드를 작성하였다. (이 부분에 대해서는 클린코드의 관점에서는 어떻게 생각하시는지 멘토님의 피드백을 부탁드리겠습니다.)

    이 부분은 최저점이 0점으로 출력되게 하는 것이 맞다고 하셔서 수정하였다. 따라서 3기 에서 , 평균이 70점 이상일 때와 , html , css , javascript 세 과목 중 2가지 과목이 100 점일 경우 합격 처리를 하도록 하였다.
    또한, 전체 과목의 평균 부분에서는 형변환을 통해 double로 소수점까지 출력하였다.

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {

        int a=0; // 기수
        int html=0;
        int css=0;
        int javascript=0;
        int aver= 0 ; //세과목의 평균
        int max=0; // 세 과목 중 최고점
        int min=0; // 세 과목 중 최저점

        System.out.print("몇 기인지 입력해주세요.");
        Scanner scanner = new Scanner(System.in);
        a = scanner.nextInt();

        System.out.print("HTML 과목 점수를 입력해주세요.");
        html = scanner.nextInt();

        System.out.print("CSS 과목 점수를 입력해주세요.");
        css = scanner.nextInt();

        System.out.print("Javascript 과목 점수를 입력해주세요.");
        javascript = scanner.nextInt();

        aver = ((html + css + javascript)/3);
        max = (html > css) ? html : css;
        max = (max > javascript) ? max : javascript;

        min = (html < css) ? html : css;
        min = (min < javascript) ? min : javascript;

        if (a == 1 || a ==2) //평균 점수가 60점 이상 합격
            if (aver >= 60) {
                System.out.println("합격입니다.");
                System.out.println("전체 과목 중 최고점은 "+max+"점 입니다.");
                System.out.println("전체 과목 중 최저점은 "+min+"점 입니다.");
                System.out.println("전체 과목의 평균은 "+(double)(html + css + javascript)/3+"점 입니다.");
            } else {
                System.out.println("불합격입니다.");
                System.out.println("전체 과목 중 최고점은 "+max+"점 입니다.");
                System.out.println("전체 과목 중 최저점은 "+min+"점 입니다.");
                System.out.println("전체 과목의 평균은 "+(double)(html + css + javascript)/3+"점 입니다.");
            }
        else if (a == 3) //평균점수가 70 점 이상 합격 or 두 과목 이상 100점 일 경우 합격
        {
            if (aver >= 70) {
                System.out.print("합격입니다.");
                System.out.println("전체 과목 중 최고점은 "+max+"점 입니다.");
                System.out.println("전체 과목 중 최저점은 "+min+"점 입니다.");
                System.out.println("전체 과목의 평균은 "+(double)(html + css + javascript)/3 +"점 입니다.");
            } else if ((html == 100 && css == 100) || (html == 100 && javascript == 100) || (css == 100 && javascript == 100) ) {
                System.out.println("합격입니다.");
                System.out.println("전체 과목 중 최고점은 " + max + "점 입니다.");
                System.out.println("전체 과목 중 최저점은 " + min + "점 입니다.");
                System.out.println("전체 과목의 평균은 " + (double) (html + css + javascript) / 3 + "점 입니다.");
            }
            else {
                System.out.println("불합격입니다.");
                System.out.println("전체 과목 중 최고점은 "+max+"점 입니다.");
                System.out.println("전체 과목 중 최저점은 "+min+"점 입니다.");
                System.out.println("전체 과목의 평균은 "+(double)(html + css + javascript)/3+"점 입니다.");
            }
        }
        else
        {
            System.out.println("기수를 올바르게 입력해주세요.");
        }
    }
}

출력




2회차 심화미션

JVM

Java Virtual Machine 의 줄임말이다. OS에 종속받지 않고 CPU가 Java 를 인식, 실행할 수 있게 하는 가상 컴퓨터이다.
Java 소스코드, 즉 원시코드 (x.java) 는 CPU가 인식하지 못하므로 기계어로 컴파일을 해줘야한다. 하지만 Java 는 JVM 이라는 가상머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환된다.

JVM 역할 및 특징

Java compiler 가 .java 파일을 .class 이라는 Java bytecode 로 변환한다.
변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다. 이 때, JVM이 OS가 bytecode를 이해할 수 있도록 해석해준다. 따라서 bytecode 는 JVM 위에서 OS 상관없이 실행될 수 있는 것이다. OS에 종속적이지 않고, java 파일 하나만 만들면 JVM 위에서 실행할 수 있다.

JVM의 구조

  • 클래스 로더
  • 실행 엔진
    • 인터프리터
    • JIT 컴파일러
    • 가비지 콜렉터
  • 런타임 데이터 영역

JVM 메모리 영역 구조

GC

Garbage Collector 의 줄임말이다. 자바 애플리케이션에서 사용하지 않는 메모리를 자동으로 수거하는 기능을 말한다. C/C++ 같은 언어는 메모리를 할당하고 직접 해제해야했지만, 자바에서는 GC를 이용하여 개발자들이 메모리 관리를 비교적 신경쓰지 않아도 된다.

GC 동작 방식


정리

  • 배운 내용, 깨달은 점
    이번 2회차의 학습 키워드를 통해, 자바의 기본적인 자료형, 입/출력, 연산자, 형변환, 조건문을 학습하였다. 언어에 따른 조금의 차이는 있었지만 큰 틀은 비슷하여 금방 익힐 수 있었다. C++ 과의 다른 점이 조금 존재하여 이상한 부분에서 헤메기도 하였지만, 과제를 마무리 하는 데에 있어서는 큰 문제가 없었다.
    long 변수형은 그냥 쓰면 되는게 아니라 마지막에 L을 붙여야 한다는 것도 알게 되었다.
    또한, 심화미션을 조금 진행해보았는데, 아직 심화미션까지 이해하기에는 어려움이 많아 이해할 수 있는 부분까지만 작성해보았다. JVM과 GC가 무엇인지는 알게 되었다. 구조나 작동원리는 조금 더 공부해보아야 할 것 같다.
  • 어려웠던 점, 반성하고 싶은 점 / 개선할 방법
    이번 2회차 미션에서는 3기에서 두 과목 이상이 100점일 때, 합격처리를 하고 최고점과 최저점을 100으로 출력되게 하는 부분이 고민이였다. 100 점 이상일때만 합격으로 처리하고, 최고점 최저점은 원래대로 출력하도록 하였다. 최대한 깔끔하게 코드를 작성하고 싶어서 고민을 하다가, 논리 연산자를 통해 조건을 만족하도록 코드를 작성하였다.
    또한 심화미션을 진행해보았는데, JVM과 GC가 무엇인지는 알게 되었지만, 구조나 작동원리는 시간이 좀 더 필요할것 같아 따로 시간을 내서 정리해보아야 할 것 같다. 아직 공부할 것이 많다고 느껴 얼마 남지 않은 방학을 허투루 쓰지 않고 시간을 투자해야할 것 같다.
  • 궁금한 점
    1. 미션이 아직까진 어렵지 않아 진행하는데 어려움이 없었습니다. 혹시 클린코드 관점에서는 어떻게 생각하시는지 피드백 부탁드려도 될까요?
    2. 또한 제 코드에서 aver 라는 변수를 int 형 변수끼리의 계산을 위해 int 형으로 선언하고, 평균을 계산할때 형변환을 통해 소수점까지 출력되게 하였습니다. 이 부분을 좀더 깔끔하게 변경할 수 있을까요? (위의 클린코드 관점에서와 내용이 비슷할수도 있는데 이게 따로 질문해야하는지 헷갈려서 따로 여쭤봅니다!)
    3. 그리고, 혹시 블로그글에 내용을 좀 더 내용을 추가하는게 좋을지 여쭤보고 싶습니다. 아는 부분이 많아서 설명을 많이 하진 않고 넘겼는데, 한번 할때 아는 것이라도 자세하게 공부한 내용을 작성하는게 좋을까요? 아니면 후에 미션 진행하는데에 있어서 몰랐던 내용들을 위주로 적는게 도움이 될까요?
    4. 마지막으로 제가 미션은 아직 어려움이 없지만 심화미션은 조금 어렵다고 생각이 드는데, 이러한 부분은 언제쯤 준비하면 좋을지 여쭈어 봅니다. 면접에서 주로 나오는 내용들 같은데, 아직은 제가 면접 준비를 할 시기가 아니긴 해서 심화미션은 넘겨도 좋을지 아니면 훑어보는 형식으로라도 보는게 좋을지 여쭤 봅니다!

1개의 댓글

comment-user-thumbnail
2023년 2월 8일

미션이랑 심화미션까지 잘 수행해주셨네요😄👍 궁금한 점도 잘 정리해주셔서 하나하나 답변 드려보겠습니다!

  1. 클린 코드에는 정답은 없으나, 추천드릴 키워드나 조금 더 깔끔하게 바꾸기 위한 키워드들을 제시해드리도록 할게요:)
  1. 추후에 제가 작성한 코드 올려드릴텐데, 그 형태 보고 한 번 비교해보면 좋을 것 같네요!! 전 인원 피드백 끝나는대로 바로 올려드리겠습니다:)

  2. 기록으로 남길 때는 기존에 아는 내용보다는, 몰랐던 내용이나 어렵다고 느낀 내용을 기록으로 남기시는 게 훨씬 도움이 많이 될거에요😄 그래도 아는 내용도 한 번 더 정리한다면 복습의 효과로도 좋을 것 같네요ㅎㅎㅎ

  3. 심화 미션은 자바와 스프링을 활용한 프로젝트 경험을 하신 뒤에, 심화 미션을 수행하셔도 늦지 않습니다:) 지금은 심화미션은 넘기셔도 좋습니다~~~

답글 달기