20210915 Java 시작

DUUUPPAAN·2021년 9월 15일
0

교육 20210915~ Java

목록 보기
1/13

·답답했던 전날

-어제의 답답함이 나 혼자만의 답답함이 아니었다는 것을 시인하시 듯이, 교수님도 어제 너무 힘든 다운로드였다고 말씀하셨다. 특히, 지금껏 가르치면서 처음 겪어보는 오류에 적잖이 당황하시기도 했다고 하시면서, 이클립스 무반응이나 다른 오류들을 분명 언젠가는 다른 사람들도 겪을 것이며, 미리 간접적으로 겪어보고 문제를 해결해보았으니, 그래도 분명 얻는 것이 있었을 것이라고 하셨다. 그렇다. 적어도 이제 나는 어제 일어난 오류들은 스스로 해결할 수 있을 것이다. 어차피 학원 컴퓨터에 스스로 설치를 해야하는데, 설치방법도 잘 숙지하고 학원에 가면 더 잘 설치할 수 있을 것이다.

·본격적인 시작

-어제는 시간 상, 겨우 출력정도만 해봤고, 사실상 시작은 오늘이었다.
교재의 순서대로 따라가느라, 우선 변수부터 공부했다.

그동안에는 변수를 선언해도, 그냥 var 변수명; 정도의 간단한 과정만 있었다. 또한, 변수를 활용하기 위해 배운 변수의 자료형도 몇 가지 없었다.
정수형, 실수형, 문자형, 불린형 정도의 간단한 자료형들만 알고 있었다.

그런데 java 교재를 보니, 데이터 타입은 기본형 8개와 기본형 8개를 제외한 참조형이라는 수많은 형태가 존재했다. 이게 그냥 알고만 있어도 되는 것이라면 좋겠지만, 애초에 자바는 변수를 선언할 때, 해당 변수가 어떤 타입인지도 같이 선언해줘야 해서 전부 알고 있긴 해야했다. 또, 비슷한 데이터 타입 같아도, 담을 수 있는 크기에 따라서 다른 데이터 타입으로 선언해줘야 했기에, 데이터 타입이 각각 담을 수 있는 크기도 배웠다. 사실 크게 외울 필요까지는 없다고 하셨지만, 어느정도의 크기를 담을 수 있는지 정도를 살펴보는 것은 유익하다고 하셨다.
8가지 중에 주의해야 할 것은, 크게 두 가지 정도인데,
1. char 변수는 숫자를 문자로 줄 수 있지만 반드시 ''안에서 숫자를 써줘야 한다. 만약 그냥 바로 숫자를 입력하면 유니코드 0~65535의 범위에서, 할당된 숫자와 매치되는 문자를 담는다.
예를 들면, char engChar = 65; 이렇게 쓰고 해당 변수를 출력하면, 65를 문자로 나타내는 것이 아니라, 유니코드 범위에 65번에 매치되어 있는 'A'라는 문자를 출력한다.
2. 기존에는 실수형 변수는 float으로 인식이 강하게 박혀있었는데, java에서는 기본적으로 실수 값을 사용하면 double타입으로 인식하게 된다고 한다. 그래서 만약 float으로 변수를 선언하고 싶으면 반드시 접미에 f나 F를 붙여야 한다.
float var_float = 5.15f;처럼.

변수 타입별 크기가 중요한 이유는, 데이터 타입을 바꿀 때 굉장히 중요할 수 있는데, 큰 데이터를 작은 데이터에 넣을 때, 명시적으로 변환해주지 않으면, 오류가 난다.

int varInt = 100;
byte varByte = varInt;

위의 결과는 오류가 난다. 왜냐하면, int의 데이터 타입이 byte의 데이터 타입보다 크기 때문이다.
따라서 명시적으로

byte varByte = (byte) varInt;

이렇게 작성해줘야 오류가 나지 않는다. 물론, 명시적 형 변환에는 당연히 값 손실이 있을 수 있다. 예를 들면, 실수형 변수를 정수형으로 바꾼다면, 당연히 소수점이 없는 정수형 변수로 변환되는 과정에서 소수점 이후의 값들의 손실이 발생한다.

또한, int형보다 작은 타입의 정수 타입끼리 연산을 하면 int형으로 자동 형 변환된 후 연산된다!! 아주 중요한 부분~~!!!

단, 정수형과 실수형이 연산되면, 당연히 범위가 더 넓은 실수형으로 변환된다. float과 double의 계산도 더 넓은 범위의 double형이 되고 연산된다. 암기하기보다는 당연히 이렇게 되겠구나 이해를 하고, 결과를 받는 변수를 해당 변수로 선언해주면 될 것 같다.

·산술 연산자

-연산자의 우선순위 표도 있었다. 그런데, 그다지 크게 혼란스럽거나 하지 않았다. 왜인지 모르겠으나, 너무 익숙한 아이들이 많았고, 논리연산자보다 비교 연산자가 더 우선순위라는 것은 if문이나 for문을 사용할 때 조건식에서 자주 사용했어서 그런 것들이 굉장히 낯설지 않았다.


public class OperationTest1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//산술 연산자 테스트
		int result = 0;
		int var_int1 = 10;
		int var_int2 = 2;
		
		//연산
		result = var_int1 + var_int2;
		System.out.println("var_int1+var_int2 = "+ result);
		
		result = var_int1 - var_int2;
		System.out.println("var_int1-var_int2 = "+ result);
		
		result = var_int1 * var_int2;
		System.out.println("var_int1*var_int2 = "+ result);
		
		result = var_int1 / var_int2;
		System.out.println("var_int1/var_int2 = "+ result);

		result = var_int1 % var_int2;
		System.out.println("var_int1%var_int2 = "+ result);
	}

}

result라는 변수를 이용해서, 연산된 값을 계속 대입시켜주고, 출력했다. 결과는
12, 8, 20, 5, 0. 너무 당연한 결과여서 의문점도 없었다.

·String[] args

-아직 public static void main(String[] args)를 확실하게 이해할 수 있는 단계는 아니여서 정확하게 이해하지는 못했다. public은 누구나 이용할 수 있다는 것이고, static은 정적함수, void는 실행은 시켜주지만 값을 돌려주지 않는다라는 의미, 그리고 (String[] args)의 의미는, 프로그램 실행할 때 던져진 인자들을 문자열 배열로 받겠다는 의미이다. 이를 이용해서, 콘솔에서 점수를 입력받아 성적을 출력하는 프로그램과 유사하게 입력을 받아서 프로그램을 실행할 수 있게 실행해봤다.

public static void main(String[] args) {
		// TODO Auto-generated method stub
		int total = 0;
		int avg = 0;
		int kor = Integer.parseInt(args[0]);//국어
		int mat = Integer.parseInt(args[1]);
		int eng = Integer.parseInt(args[2]);
		
		total = kor + mat + eng;
		avg = total/3;
		
		System.out.println(kor);
		System.out.println(mat);
		System.out.println(eng);
		System.out.println(total);
		System.out.println(avg);

보면, args[0]의 배열부터 시작해서 [2]까지를 변수에 대입한다. 다만 이 때, 데이터형이 문자열이기 때문에, Integer.parseInt();를 통해 정수형으로 바꿔준다. 그래야 연산이 가능하기 때문에.
그 후에 run configurations에 main class를 해당 class의 파일명으로 바꿔주고, arguments의 부분에 program arguments의 텍스트박스에 각각 [0]의 인덱스부터 그 부분에 해당하는 값을 넣어주면 된다. 위의 예로 들면, 0번째 인덱스는 국어, 1은 수학, 2는 영어점수를 입력하면 된다. 입력 시, 띄어쓰기 혹은 엔터키로 구분한다.

-이 밖에도 증감연산자, 비트 연산자, 쉬프트 연산자를 배웠다. 비트 연산자와 쉬프트 연산자 덕에 2진수를 16진수로 바꾸는 것과 그 반대로 바꾸는 방법도 배우고, 급 수학시간이 되었다.

·복합 연산(연산과 대입 시 주의)

		int x = 5;
		
		x+=5;
		System.out.println("x+=5의 결과는 "+ x);
		x+=3.1;
		System.out.println("x+=3.1의 결과는 "+ x);
		
		x*=2;
		System.out.println("x*=2의 결과는 "+ x);
		
		x/=2;
		System.out.println("x/=2의 결과는 "+ x);
		
		x-=5;
		System.out.println("x-=5의 결과는 "+ x);
		
		x%=2;
		System.out.println("x%=2의 결과는 "+ x);

위의 코드는 단순하게 한 블록씩 계산하면, 큰일난다. 왜냐하면, x의 값이 계속 바뀌고 다시 그 값이 대입되고 있기 때문에, 바뀐 값으로 계속 계산을 해줘야하기 때문이다.
x의 값은 처음엔 5, 다음엔 10, 다음엔 13(여기서 복합연산자의 연산 결과는 좌측의 변수 타입으로 자동 형 변환해준다는 것을 반드시 기억! 만약, x= x+3.1; 이였다면 컴파일 오류가 난다고 한다. 그런데 전에 실수형과 정수형의 연산 결과는 double형이 되는 것이 아니었나... 왜 오류가 나는 것인지 궁금하다. 일단 지금까지 나는, 결과가 double형인데 위의 int x는 정수형으로 선언했기 때문에 자동으로 바꾸지 않기 때문에 오류가 나는 것으로 이해했다.) 그 다음엔 26, 13, 8, 0이다.

·삼항 연산자

  • 문법 형태
    (조건식) ? 조건식이 참일 때 변환값 : 조건식이 거짓일 때 반환될 값

삼항연산자는 개인적으로 if문을 간단하게 사용하도록 만든 연산자 같았다.
if문으로 동일하게 만들 수 있지만, 연산자를 통해 더 간단하게 작성할 수 있는 느낌이었다.

public static void main(String[] args) {
		int num = Integer.parseInt(args[0]);
		String msg = (num%2 ==0) ? "짝수" : "홀수";
		System.out.println(num+"은 " +msg+"입니다.");

· for과 if 사용

-이 두가지는 많이 사용해봐서 딱히 어려울 것은 없었다. 다만 i로 사용했던 변수를 무조건 선언해줘야 한다는 점만 좀 달랐다.

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		for(char i = 'a'; i<='z'; i++) {
			System.out.println(i+ " ");
		}
	}
	public static void main(String[] args) {
	
	String id = args[0];
	String password = args[1];
	
	if(!id.equals("java")) {
		//id.equals("java")는 id가 java와 같은가?;
		System.out.println("당신은 우리 회원이 아닙니다.");
	}
	else if(!password.equals("java")) {
		System.out.println("비밀번호가 맞지 않습니다.");
	}
	else {
		System.out.println("로그인 되었습니다.");
	}
	}

로그인 정보를 이런식으로 확인하지 않겠지만, 단순히 if를 사용하는 데에 의의를 두자고 하셨다. 다만, 교과서에서는 이런식의 작성보다는

	public static void main(String[] args) {
	
	String dbId = "java";
	String dbPasswd = "java";
	
	String userId = args[0];
	String userPasswd = args[1];
	
	int loginResult;
	
	if(!userId.equals(dbId)) {
		loginResult=1;
	}
	else if(!userPasswd.equals(dbPasswd)) {
		loginResult=2;
	}
	else {
		loginResult=3;
	}
	
	if(loginResult==1) {
		System.out.println("당신은 회원이 아닙니다.");
	}
	else if(loginResult==2) {
		System.out.println("비밀번호가 틀렸습니다.");
	}
	else {
		System.out.println("환영합니다.");
	}
	}

위와 같은 방식으로 결과를 loginResult에 넣어서 그 결과값을 사용해서 결과에 따른 출력을 하는 것이 더 좋다고 했다. 코드의 재사용성을 향상시킬 수 있기 때문에! 코드는 최대한 수정 없이 재사용할 수 있으면 좋다고 했다.

이 외에도 굉장히 많은 내용들을 입력하고 배웠지만, 아직까지는 데이터 크기와 종류 등에서 조금 헷갈리는 부분이 있었지만 수월했다. 아직까지는 전에 배운 내용들을 다른 방식으로 입력하는 느낌이 강했기 때문이다. 그러나 곧 엄청나게 어려워질 것이라고 하셨다. 정말 정신 바짝차려야겠다.

·2차 접종

-오늘 2차 접종을 받았다. 수업 중간에 나가서 중간에 놓친 부분들은 교재에서 찾아서 스스로 쉬는 시간에 공부했다. 그 잠깐이 args[]을 받아서 입력하는 부분이었는데, 그 부분을 모르니 내 코드는 실행이 되지 않았다. 그래서 접종 받고 와서 초반엔 굉장히 힘든 부분이 많았다. 왜 똑같이 입력했는데 되지 않지? 하면서 발을 동동 굴렸다. 여쭤볼 수도 없는게, 내가 수업을 못 들은 부분이라서 여쭤볼 수 없었다. 다행히 쉬는 시간을 적극활용해서 해당 부분을 해결하니 그 다음부터는 수월했다.

다만, 교재를 안가져간 학생들이 꽤 있어서 자꾸 교재의 내용을 보여주시려고 타이핑을 하셨다. 저번주부터 교재를 가져가라고 하셨는데, 교재 없이 수업이 진행이 되려면 교수님이 계속 타이핑해야만 하는 상황이었다. 이는 결국 배우는 시간이 줄어드는 결과를 가져왔다. 왜 남에게 피해를 입히시는지 정말 모르겠다. ㅜㅜ 제발 오늘 책을 다 수령해서 내일은 그런 시간이 조금 줄었으면 한다.

한가지 걱정되는 부분은 2차 접종 후 다음날부터 굉장히 아프다고 한다. 내일 과연 정상적인 수업이 될지 의문이다. 그래도 운동을 2일간 못하니, 충분히 쉬면서 공부하면 집중할 수 있겠지. 파이팅!!!

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

0개의 댓글