20211018 두번째 수업!

DUUUPPAAN·2021년 10월 18일
0

·두번째 수업!

-역시 이번 교수님의 수업 방식은 정말 잘 맞는다. 기본적으로 설명해주시는 내용이 굉장히 체계적이고 또렷하다. 물론, 지금 배우는 부분이 전에 배웠던 것들과 굉장히 큰 맥락에서 겹치지만 여러 팁과 세세한 부분이 다르고, 전보다 그래도 조금 성장해서 조금만 봐도 크게 얻어가는 것이 있었다. 그래서 비슷한 수업의 내용이었지만, 정말 좋았다.

·아스키코드

-아스키코드를 굉장히 구체적으로 살펴보지는 않았다. 다만, 기억할 두 숫자는 확실하게 짚어주셨다. 대문자 A는 65 소문자 a는 97. 딱 이것만 기억하면 된다고 하셨다.

·printf

-그동안은 println과 print만 사용했었다. printf를 사용한 적이 한번 있었는데, 정확한 구조나 사용법을 알려주신 것이 아니라 그냥 툭 넘어간 느낌이여서 매우 생소했다. 구조는 굉장히 간단했다. 그냥 넣어주고 싶은 말들을 넣어주고, 따로 바뀌는 부분은 넣어주는 값들의 데이터 타입에 따라 바꿔 넣어주면 되는 것이다.

정수는 %d
실수는 %f
문자는 %c
문자열은 %s
불린 타입은 %b

위와 같이 써주고 싶은 문장 사이에 넣어주면 된다. 순서는 넣어준 순서대로, 쉼표로 구분한다. 오히려 사용해보니 같은 문장이라도 +를 여러번 넣어주는 것보다 더 편한감이 있었다.

int a = 2;
double b = 2.143;
char c= 'A';
String d= "문자열";
System.out.println("정수는 "+a+"입니다.");
System.out.printf("정수는 %d입니다.\n", a);
System.out.println("실수는 "+b+"입니다.");
System.out.printf("정수는 %f입니다.\n", b);
System.out.printf("정수는 %.2f입니다.\n", b);
//.2f는 점 뒤에 2번째 자리까지 표기한다는 뜻.
System.out.println("문자는 "+c+"입니다.");
System.out.printf("문자는 %c입니다.\n", c);
System.out.printf("문자는 %c입니다.\n", 65);
//숫자를 넣으면 아스키코드에 대입된 값이 나옴.
System.out.println("문자열은 "+d+"입니다.");
System.out.printf("문자열은 %s입니다.\n", d);

보시다시피 ++두개를 넣고, ""도 두번 넣어야 하는 전자와 달리 굉장히 편하게 쓸 수 있다. 물론, 개항이 포함된 기능이 아니기 때문에, \n을 안해주면 다음항으로 넘어가지 않는다.

·가위바위보

-가위바위보를 하기 위해선, random 함수를 통해 컴퓨터가 갖는 값을 만들어야 했다. 그래서 Math.random()을 사용했다. 단, Math.random()은 0부터 0.99999...의 값을 리턴해주기 때문에, 1,2,3을 나타내기 위해선 *3+1을 해주면 된다. 뒤에 +1이 없다면 0,1,2가 된다. 단, 위에서 말했듯, double의 형을 갖기 때문에 정수를 얻으려면 정수로 형변환을 해줘야 한다. 물론, 형변환 시 .뒤의 값들은 그냥 손실된다.

-가위는 1, 바위는 2, 보는 3이란 숫자로 나타낸다. 1,2,3 중 숫자 하나를 입력받아서 컴퓨터가 내는 랜덤의 숫자 1,2 혹은 3과 대조 후에 결과를 승, 패 , 무승부로 보여준다. 이 문제는 모든 경우의 수를 다 써주고, 입력자의 값에서 컴퓨터의 값을 뺀 결과를 사용하든 반대의 경우를 사용하든 하여, 각각의 결과 값이 누구의 승리가 되는지를 살펴보면 된다.

	public static void main(String[] args) {
		System.out.print("가위(1) 바위(2) 보(3) 중 하나를 입력하세요.> ");
		Scanner sc = new Scanner(System.in);
		int user = sc.nextInt();
		int com = (int)(Math.random()*3)+1;
		int result = user - com;
		
		System.out.printf("당신은 %d입니다.\n", user);
		System.out.printf("컴은 %d입니다.", com);
		
		if(user == com) {
			System.out.println("비겼습니다.");
		}else if(result ==-1 || result == 2) {
			System.out.println("컴이 이겼습니다.");
		}else {
			System.out.println("당신이 이겼습니다.");
		}
	}

단, 이 경우는 switch문이 조금 더 직관적으로 이해하기 쉽다.

		public static void main(String[] args) {
		int user = 0;
		int com = (int)(Math.random()*3)+1;
		System.out.print("가위(1) 바위(2) 보(3) 중 하나를 입력하세요.> ");
		Scanner sc = new Scanner(System.in);
		user = sc.nextInt();
		
		System.out.println("당신은 "+user+"입니다.");
		System.out.println("컴퓨터는 "+com+"입니다.");
		
		switch(user-com) {
			case 0:
				System.out.println("무승부입니다."); break;
			case 2:
			case -1:
				System.out.println("컴퓨터가 이겼습니다."); break;
			case -2:
			case 1:
				System.out.println("당신이 이겼습니다."); break;
		}
	}

여기서 case 2: 뒤에 아무 내용도 없이 case -1:로 넘어가는 이유는 어차피 해당 부분에 break가 없으면 바로 아래의 case로 넘어가기 때문이다. 즉, 결국은 case 2와 case -1은 같은 결과를 갖게 된다.

·for문

-for문은 굉장히 많이 써봤기 때문에, 익숙해졌을 줄 알았지만, 오늘 또 새로운 것들을 많이 배웠다.

-초기값을 주는 i나 j 등의 변수를 보통은 for문의 괄호 안에서 그냥 선언해버렸다. 즉, 지역변수로 설정해줬었다. 그런데, 교수님은 for문을 여러개 사용할 것이라면 그냥 전역 변수로 i와 j를 선언해주고, 해당 값들을 초기화해나가면서 사용할 것을 권고하셨다. 왜냐? 어쨌든 빠르게 컴파일 하는 것이 좋은데, 변수를 지역변수로 설정하면 반복문의 종료와 동시에 선언한 변수가 사라진다. 그렇다면, 다음 반복문에서 또 변수가 선언되고 또 for문 종료와 동시에 사라진다. 그럴바엔 그냥 변수를 전역변수로 하는 것이 더 처리 속도가 빠르다는 것이다. 결국 얼마나 간결하게 얼마나 가볍고 빠르게 기능을 수행하는 코드를 작성하냐가 개발자의 역량인 것 같다.

·구구단 출력 프로그램

-이중 for문을 사용할 때, 행과 열로 결과를 먼저 보고 하는 것이 좋다. 행에 해당하는 부분에서 변하지 않는 값을 i라고 생각하고, 열의 부분에서 변하는 값을 j로 생각하면 쉽다. 내부의 for문이 한번 다 돌고 나서 변하는 값이 i라고 생각하면 되는 것이다.

	public static void main(String[] args) {
		int i,j;
		for(i=1;i<=9;i++){
				for(j=2;j<=4;j++){
				System.out.print(j+" * "+i+" = "+j*i+"\t");
			}
			System.out.println();
		}
}

좀 헷갈리긴 했지만, 표현하려는 값들을 먼저 적어놓고 i값과 j값을 각각 생각해보니 굉장히 수월했다.

·변수의 값을 서로 바꾸는 방법

-사실 그냥 주어졌다면 조금 고민되었을 것 같지만, 변수 하나를 더 추가하면 굉장히 쉬워졌다. a와 b의 값을 서로 교체하려면 그냥 변수 하나를 더 잡아서 각각 넣어주면 된다.

int a = 3;
int b = 5;
int tmp;

tmp = a;
a = b;
b = tmp

a의 값을 tmp라는 변수에 넣어주고, a에 b의 값을 넣어주면 a에는 b의 값이 들어간다. 그리고 b에 tmp에 들어있는 a의 값을 넣어주면 a와 b의 값이 바뀐다.

입력값을 받아서 큰 수부터 작은 수까지의 구구단이 출력되게 하는 프로그램을 작성

	public static void main(String[] args) {
		System.out.println("========입력값부터 입력값까지의 구구단 출력 프로그램=============");
		System.out.print("숫자 a를 입력해주세요.> ");
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		System.out.print("숫자 b를 입력해주세요.> ");
		int b = sc.nextInt();
		int temp;
		if(a<b) {
			temp = a;
			a = b;
			b = temp;
		}
		int i,j;
		for(i=1;i<=9;i++) {
			for(j=a;j>=b;j--) {
				System.out.printf("%d * %d = %2d\t", j, i, j*i);
			}
			System.out.println();
		}
		
	}

a의 값이 항상 더 커야하기 때문에, 사용자가 어떤 값을 입력하더라도 두 값 중에 큰 값을 a에 넣어줘야 한다. 그래서 조건문으로 a가 더 작은 값이 들어갔다면 a와 b의 값을 변경해준다. 그 뒤의 반복문은 위에 했던 방식으로 생각해보면 금방 도출할 수 있다.

·내일 배울 것, 배열

-배열은 전에도 배웠지만, 너무 그냥 대충 설명하셨었다. 사용은 해봤지만, 내가 저렇게 사용은 못할 수준으로 배웠고, 실습을 해봤지만 그래도 뭔가 확 와닿지 않은 느낌이 있다. 그래서 내일 할 배열 수업이 정말 기대되고 좋다. 점점 더 아는 것들을 더 자세하게 알고 넘어가면 좋겠다. 앞으로도 파이팅! 내일은 대면수업이다. 이번 교수님은 강제성을 어느정도 주신다고 하셔서 내일 대면 수업은 5~6명이 아닌 15명 정도가 될 것 같다. 앞으로 프로젝트도 해야하니까 사람들이 나오는 것도 나쁘지 않은 것 같다. 앞으로 더 잘 지내보도록 노력해보자!! 운동도 영어 공부도 계속 하기!!!

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

0개의 댓글

관련 채용 정보