20210916 아직 낯선 이클립스

DUUUPPAAN·2021년 9월 16일
0

교육 20210915~ Java

목록 보기
2/13

·자바 복습

  • 아직은 메모장이나, editplus 등을 키지 않고, 이클립스를 누르는 시작부터 뭔가 어색하다. 뭐 얼마나 했다고 전에 썼던 프로그램이 익숙한지 모르겠다. 오늘의 시작도 역시 복습이었다. 아직 익숙하지 않은 변수 선언에 대한 부분이나, 변수별 용량 등등을 다시 복기했다. 사실 용량에 대해 크게 개의치 않아도 된다고 하셨다. 어차피 쓰는 변수들은 거의 정해져 있다고 하셨다. 실제로, 오후에 진행한 여러 코드들도 거의 사용하는 변수들을 사용했다.

·입력값을 받기

-입력값을 받는 방법을 어제는, args[0]같은 방식으로 받았다. 물론 입력이 쉬운 편은 아니었다. 왜냐하면 파이썬에서는 바로 콘솔창에서 입력이 가능했기 때문이다. 자바는 계속 이런 식으로 입력값을 넣어야 하는 것인지 궁금했다, 사실 조금 귀찮았다. 왜냐하면 어떤 코드들은 제대로 작동하는지 여러 범위의 값들을 넣어서 확인해봐야 하는데, 그때마다 이렇게 run configuration부터 시작해서 브라우저에 서치에 arguments도 들어가서 변수를 일일이 눌러준다는게 상당히 번거로웠다.

다행히 오늘 이 변수를 파이썬에서처럼 콘솔에서 입력받는 방법을 배웠다. 아직은 낯선 내용이었지만, 자체적으로 해당기능이 없어서 import java.util.Scanner;를 코드 초반에 넣어줘야 했다.

import java.util.Scanner;

public class Program_3 {

	public static void main(String[] args) {
	Scanner sc = new Scanner(System.in);
	System.out.print("점수입력: ");
	int nextIntNum = sc.nextInt();
	if(nextIntNum >=60 ) System.out.println("합격");
	else System.out.println("불합격");
	}

}

여기서 주의할 점은, Scanner의 기능을 받는 변수를, (위에서는 sc로 받음)
다시 사용할 변수에 넣어줄 때, 정수형이라면 sc.nextInt(); 그냥 문자열이라면 sc.next(); 같이 변경해줘야 한다. 이렇게 하면 입력값을 콘솔에서 직접 입력할 수 있다. 이런 기능으로 전에 자바스크립트에서 했던 여러가지를 해보았다.
성적 확인

import java.util.Scanner;
public class Main_2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
/*성적 프로그램, 스캐너로 입력받아서, 90점 이상은 + 80점 이상은 b
 * 70점 이상은 c 나머지는 f를 인쇄*/
	Scanner sc = new Scanner(System.in);
	System.out.print("성적을 입력하세요: ");
	int score = sc.nextInt();
	String grade;
	if (score >=90) {
		grade = "A";
	}
	else if(90>score && score>=80) {
		grade = "B";
	}
	else if(80>score && score>=70) {
		grade = "C";
	}
	else {grade = "F";};
	System.out.println("당신의 점수는 "+score+"이므로 학점은 "+grade+"입니다.");
	}

}

위와 같이 점수를 입력하면 범위에 따라 다른 결과가 나오게 만들어봤다. 전에 많이 해봤던 것이라 굉장히 쉬웠다. 새로배운 Scanner 기능만 헷갈리지 않게 잘 입력하면 굉장히 쉬웠다.

·반복문과 조건문, continue와 break

-전에도 써봤지만, 사실 어떻게 동작하는지에 대해 깔끔하게 정리되지 않은 상태로 넘어간 continue와 break에 대해 상당히 자세하게 다뤄봤다. 간단하게 말하자면, continue는 조건에 만족 시 다시 돌아가서 수행하는 것이고, break는 해당되는 영역을 그만 수행하고 나가는 것이다. 굉장히 직관적이지만, 사실 어떤 영역으로 돌아가는지 어떤 영역까지 끊고 이어지는지 등등이 굉장히 헷갈렸다. 그래서 for 안에 for을 넣고 if문에 continue와 break 등을 사용하면서 확실하게 어디로 가는지 어디서 반복하는지 등을 깨우쳤다.
특히, 라벨기능을 만들면, break를 특정 부분으로 보낼 수 있다는 것도 배웠다. 약간 좌표를 설정해주는 느낌이었는데, 생각보다 훨씬 더 다양하게 만들어 낼 수 있는 엄청난 기능인 것 같았다.


public class FlowTest23 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
	int num=0;
	char c ='A';
	aaa: while(true) {
		while(true) {
			num++;
			System.out.print(c++ + " ");
			if(num%5 == 0) {
				break;
			}
			if(num==26) {
				break aaa;
			}
		}
		System.out.println();
	}
	}

}

보면 첫 while문에 aaa라는 좌표를 만들었고, 아래 if의 break뒤에 해당 좌표값을 넣어줬다. 이런식으로 사용할 수 있다는 것을 잘 알고 있어야겠다!!

·반복문

-항상 반복문이 문제인 것 같다. for문은 너무 익숙해서 사실 지금 수준에서 교수님이 수업중에 내주시는 문제는 보지 않고도 쉽게쉽게 만들어냈다. 그런데 for문에 너무 익숙해서인지 while문이 뭔가 생각만큼 쉽지 않았다. 교수님이 1~10까지 숫자들을 더하고, 그 중에 5만 빼는 방식으로 코드를 만들어보라고 하셨다. continue를 꼭 넣어서! 심지어 같이 진행도 하셨다.

for로 만드는 것은 너무 쉬워서 굳이 올리지 않겠다. 다만 while문은 조금 살펴볼 필요가 있다.


public class Main_prac2 {

	public static void main(String[] args) {
		int sum=0;
		int i=0;
		while(10>= i) {
		i=i+1;
		
		if(i==5) {continue;}
		
		sum+=i;
		}
		System.out.println(sum);
	}

}

처음에 for을 사용해서 만들었다. 당연히 정답은 50. 그런데 이상하게도 while문을 사용하니까 갑자기 다른 답이 나왔다. 심지어 교수님도 답이 다르게 나오셨다. 나는 61이 나왔고, 교수님은 60이 나오셨다. 대체 왜??
한참동안 다른 학생들까지 합세해서 여러 부분을 고쳤지만, 답이 바뀌지 않았다. 수업시간을 마쳐야되는 시간이 임박해서 그냥 그 상태로 수업을 마쳤다. 그런데 수업이 끝나고 한참을 살펴보니 문제점이 보였다.
1. 교수님은 i를 1부터 시작하셨다. 나는 0부터 시작했기 때문에 반복문이 시작하자마자 i++가 이뤄지고 그렇게되면 나는 1을 더했지만, 교수님의 코드는 2부터 더한 셈이 되는 것이다.
2. 위와 같은 이유로 i가 10까지 가게 되면 sum에 더해지는 최종 값은 10이 아니라 10+1인 11이 된다. 따라서 범위가 잘못되었던 것이다.


public class Main_prac2 {

	public static void main(String[] args) {
		int sum=0;
		int i=0;
		while(9>= i) {
		i=i+1;
		
		if(i==5) {continue;}
		
		sum+=i;
		}
		System.out.println(sum);
	}

}

위와 같이 수정해줘야 정확하게 작동하면서 50의 값이 나온다. while문을 해보니까 확실히 for문이 편한게 있는 것 같다. for로 하면 금방하는데, while은 뭔가 더 생각해줄 것이 있는 느낌이다. 안 익숙한 부분 때문일 수도 있고...
그래도 결국 혼자 답을 잘 찾아서 해결했다. 다른 분들께도 공유했고, 이유를 깨달은 분들이 감사 인사도 전해주셨다. 역시 여러명이 모여있으면 이런 긍정적인 부분도 있는 것 같다.

·개인적으로 정말 좋았던 하루

-우선 2차 접종 후에도 컨디션이 꽤나 괜찮았다. 정말 이럴 수 있나 싶을정도로 괜찮았다. 또, 오늘의 수업은 뭔가 그냥 주어지는 느낌보다는 계속 사용하면서 이렇게 작동하는구나 등을 느낄 수 있는 수업이었다. equals나 .contains나 .containsIgnoreCase 등등도 따라서 써봤고, 나중에 직접 응용해서 코드를 짤 때 써봤다. 그래서 그런지 더 뭔가 배우고 학습한 느낌이었다.

오늘까지도 운동을 못한다고 한다. 가벼운 운동이었지만 이틀 안하니까 뭔가 점점 안하고 싶어진다.... 그래도 내일 되면 꼭 운동을 해야지!!!

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글