본문 바로가기

[책]명품 JAVA Programming

명품 자바 프로그래밍 2장 요약

public static void main(String[] args)

항상 함께하지만 항상 모르는 코드. 자바의 시작과 끝은 여기서 난다. 앞이나 뒤에서 여러 클래스와 함수를 정의 해도 결국 시작과 끝은 main함수에서 이루어 진다. 이는 지금 중요한건 절대 아니다... 하지만 알고 있으면 나쁠건 없다!

이를 이해하기 위해서는 public과 static, void 가 무얼 의미하는지 알아야 하는데, 이는 책의 나중에 설명 되어 있으므로 여기선 간단하게 넘어가자.

public 은 다른 클래스나 함수에서도 main이라는 함수에 접근 할 수 있도록 함을 의미한다.

static은 프로그램 시작시 메모리에 main이 호출되어 지게 하는 것이다. 자바는 필요할때마다 클래스를 메모리에 넣고 사용한다고 1장에서 배웠는데 static으로 선언된 함수는 시작부터 끝까지 메모리에 호출 되는 것이다.

void는 함수 선언시 return값이 없다는 뜻이다. main함수가 끝날때 프로그램이 끝나는 것인데 리턴이 있으면 그게 무슨 의미를 갖겠는가?.

매개변수로는 String[] args 배열을 생성하는데 args부분은 다른거(예를들어 abcd)로 대체 가능 하다. 프로그램 실행시 main함수가 실행 되면서 외부 값을 참조할 경우 args배열에 들어 간다.

이는 나중에 학습이 끝났을때 혹시 머릿속에 이러한 지식이 남아있다면 다시 돌아와 읽어보도록 하자.

 

자바의 식별자

자바에서 개발자가 클래스, 변수, 상수, 메소드 등에 이름을 붙이는것을 식별자라고 말한다.

함수나 클래스 변수에 이름 붙일때 주의해야 할 점이 있다. 우리집 강아지 두명의 나이를 변수로 지정한다 했을때,

int 바둑이의나이 = 1; (o)

int 뽀삐의 나이 = 2; (x)

라고 입력하면 구분은 쉽겠지만 사용할 수 없다.

식별자는 공백 사용이 불가능 하고 특수문자는 사용할 수 없다. 게임의 캐릭터 닉네임 생성규칙과 동일하다.

한글은 사용할 수 있지만 잘 사용하지 않는다.

자바내에서 사용하는 키워드는 사용할 수 없다. if, while, class, public, static 등등.

파이썬에서 __init__이나 _변수명 등을 유용하게 사용하는데 자바에서는 언더바를 잘 사용하지 않는다. 써도되는데 잘 안쓴다.

대소문자 구분 해준다

int A = 0;

int a = 1;

둘 구분을 할 수 있다.

길이의 제한은 없지만 길게 하지말자.

변수명은 구글링 하다보면 동일하게 사용하는 경우가 종종 보이는데 어느정도 규칙이 있다. 예를들어 나누기를 div로 사용 한다던지 버튼의 이름을 btn 으로 설정한다던지 하는 경우. 상수명은 대문자로 한다던지 return 값이 boolean일 경우 isSingle 같이 쓰는 경우.

우리가 말하고 쓰는 한국어, 한글도 사회적 약속이 있듯이 프로그래밍에도 절대적인 룰은 아니지만 어느정도 식별자가 무얼 의미하는지 정도는 알아 볼 수 있도록 쓰는것이 좋다.

 

자바의 데이터 타입

총 8개밖에 안된다. 비트와 바이트에 대한 학습을 하면 좋지만 대충 8bit = 1byte 까지만 알아도 학습에는 지장이 없다.

boolean: 참 거짓 값으로 나오는 논리타입 (1bit)

char: 문자를 저장하는 데이터타입 (2byte)

byte: 정수 저장(1byte)

short: 정수 저장(2byte)

int: 정수 저장(4byte)

long: 정수 저장(8byte)

float: 실수 저장(4byte)

double: 실수 저장(8byte)

정수를 저장하는 변수가 byte, short, int 세개가 있다. 비트수가 많을 수록 더 많은 숫자를 처리할 수 있는데, int 형은 4바이트 니까 2,147,483,647 까지 표기 가능하다. 음수로는 -붙이고 8까지표현 가능하다.

여담으로 이 숫자가 익숙한 사람들이 있을텐데 옛날 게임들의 최대로 소지할 수 있는 돈의 액수와 동일하다. 지금은 없어진 네이버의 동물농장이 이랬고 지금은 달라졌지만 메이플스토리 라는 게임도 최대 소지 가능 금액이 21억이였다.

boolaen, char, int, float, double 까지가 자주 쓰이므로 알아가도록 하자.

String는 기본 데이터타입이 아니라 자바의 API인 String클래스에서 제공하는 문자열 데이터 타입이다.

 

변수

1. int a = 3;

2. int b;

3. int c,d,e;

4. int f=5, g=6;

다 된다. 그런데 데이터타입과 맞지 않는 변수값을 넣는건 안된다.

int h = 'a';

int t = 3.14;

이런건 안된다.

 

리터럴은 프로그램에 직접 표현한 값을 말하는데, 직접 작성하는 경우는 드물고 혹시나 소스코드에서 봤을때 이게 뭘 의미하는지 알 수 있도록 학습만 하면 될것 같다. 근데 좀 알아야 하는 특수문자 리터럴이 있다. 이에 대해서만 보고 가자.

'\t' : 탭(스페이스바 4번정도)

'\n' : 한줄 띄우기

정도는 자주 쓰이므로 외우는게 좋다.

 

앞에서 int a = 3이라고 선언 했는데 이를 double 형태로 바꿀 수 있다.

double intToDouble = (double)a

 

입력 받기

Scanner는 키입력을 받는 클래스이다. 다른 언어 파이썬이나 c와는 달리 입력 받는 방법이 조금 다르고 복잡하게 느껴질 수 있는데 그냥 사용하면 된다. '아~ 자바는 입력을 Scanner클래스를 이용해서 받는구나' 정도만 알면 된다.

자바를 이 책으로 처음 공부할 때에 지금 여길 보고 있다면 객체지향이 뭔지도 이해 못하고 클래스가 뭔지도 모르겠고 입력은 왜 또 이렇게 불편하고 객체생성이 무슨 뜻인지 생성자가 뭔지도 이해 안될것이다.

실제로 나는 Scanner scanner = new Scanner(System.in);  이부분에서 한참을 공부를 접어야만 했다.

Scanner라는 데이터 타입이 있었나? new 는 뭐지? System.in은 뭘까? 라는 의문이 꼬리에 꼬리를 물었다. 지금은 그냥 자바는 입력할때 Scanner라는 걸 만들어서 그게 입력을 도와준다. 라고만 이해하자.

 

Scanner는 '클래스' 이므로 이를 이용하기 위해서는 import가 필요하다. 프로그램 맨 앞에(클래스 바깥)

import java.util.Scanner;

자바에서 기본적으로 제공해주는 util이라는 패키지 안에 Scanner이라는 클래스가 있고 이를 지금 내가 이용하겠다는 뜻이다.

Scanner는 공백이나 줄바꿈을 기준으로 내용을 읽어들이기 때문에 띄어쓰기에 주의해서 입력해야 한다.

우리가 Scanner sc = new Scanner(System.in)으로 스캐너객체를 생성 했다면

int a = sc.next();

int b = sc.nextLine();

등으로 입력을 받을 수 있다.

여기서 nextLine은 공백도 받겠다는 뜻이다. 직접 sc.next()에 공백을 넣어서 입력을 받아보자 어떤 결과가 나오는지 해보길 바란다.

마지막으로 더이상 스캐너 객체를 이용하지 않을때에는 종료해 주는것이 좋은데 안해도 되지만 꼭 하길 바란다. 좋은 버릇은 처음에 익히는게 좋다. 나중에 배울 파일입출력때 닫는걸 안하는 경우 낭패를 볼 수 있다.

sc.close();

 

예제 2-4에 스캐너의 특성이 잘 나타나 있다. 꼭 해보길 바라고 내가 공부했을때는 이런식으로 해보았다.

여기를 보면 name2에 김자바가 들어가고 name에 나머지 전부가 들어간걸 볼 수 있는데 빈칸 단위로 끊어서 저장하는걸 볼 수 있다.

name과 name2를 바꿔서 작성하면 name2에는 뭐가 들어갈까? Scanner가 이해되지 않았다면 꼭 해보길 바란다.

 

연산

연산은 특별한건 없다. 나는 뭘 외워서 사용하는걸 잘 못하는데 이부분은 외우고 사용하는게 좋은것 같다. 몰라서 못쓰는것과 알면서도 안쓰는건 다르다.

 

비트연산은 본인이 중요하게 생각하면 하길 바란다. 시험에 나온다던지 프로젝트를 할때 필요하다던지.. 나는 네트워크의 checksum오류 검증에 비트연산이 필요해서 그때 다시 학습했다.

 

조건문

만약에 (내가가진돈이 10,000원 이상이면) {

       내가 누구? 만원 이상의 현금 오너. 라고 말할것이다.

} 근데 만약에 (내가가진돈이 10,000원 미만이라면){

       나는 만원 미만의 현금 오너. 라고 말할것이다.

}

라는걸 코드로 짠다면 어떻게 짤 수 있을까?

이렇게 짤 수 있다. 

만약 만원과 오천원 사이에 또다른 조건을 만들고 싶으면 else if 문을 if문과 else문 사이에 넣어서 만들 수 있을 것이다.

else if (myMoney>=5000 && myMoney<10000) 이렇게.

 

이렇게 if문은 조건과 조건에 맞을때 아래의 과정을 거치시오~ 라고 말하는 것이다.

if(조건){

   조건에 맞을때 결과

}

 

switch문은 if문과 동일하게 조건과 조건에 맞는 식을 작성하는 부분으로 나누어져 있다.

어떨때는switch문으로 짜는게 더 보기 쉬울때가 있고 어떨때는 if문으로 짜는게 더 보기 쉬울때가 있다.

경험상 else if문을 많이 써야 할 때는 switch문을 쓰는게 더 쉽게 짤 수 있을때가 많았다.

 

switch (조건)과{

case 값1{break;}

case 값2{break;}

}

이렇게 이루어져 있는데 '값' 에는 '조건' 에 맞게 숫자나 문자열, 변수 또는 조건식이 들어갈 수 있다.

반드시 break;문을 써야 하는데 쓰지 않으면 조건이 case 값1 에서 맞았는데 case 값2 까지 넘어가서 계산하기 때문이다.