백엔드/코드스테이츠 수강

코드스테이츠 수강_3주차_2일차_JAVA기초 (변수형, 연산자)

반 불혹 2022. 8. 31. 08:00

코드스테이츠 수강 3주차 2일차에는 JAVA 기초에 대해 배웟다.

1. 자바의 특징

자바는 특정 CPU, OS에 따라 다르게 작성할 필요가 없다.

해당 os에서 자바 가상머신을 이용해서 동작하기 때문이다. 

다른 OS에서도 잘 작동한다!

자바 가상머신은 쉽게 말하면 자바 프로그램을 실행시켜주는 프로그램이라고 보면 된다.

내가 윈도우를 쓰는 상태에서 자바 프로그램을 만들고, 옆집 똘이네 리눅스 PC에 올려도 무리 없이 작동한다는 것이다.
(물론, 해당 PC에 JRE(자바 가상머신 + 표준 클래스 = 그냥 자바 프로그램 돌리는 거)가 있으면 된다. )

2. 의사코드 

의사코드는 가독성을 고려한 코드중의 하나다. 

변수명을 의미를 가지게 하거나, 약속한 키워드로 사용하는것이다. 

예시) 결제 시스템에서 지불해야 하는 값을 담는 변수이름을 "COST"로 지정, 지불금을 "PAY"로 지정하는 경우, 의사코드 완성

의사코드를 작성한다고 PC가 더 빨라지거나 하는건 아니다. 다만, "사람"입장에서 해당 코드를 다루기 더 쉬워지는 것이다.

만약 귀찮아서 변수를 A, A_1, A_2..... 이런식으로 지정하면 읽는사람은 뭔지 모를것이다. PC로는 작동하는데 말이다.

 

3. 변수 

변수는 일종의 상자와 같다. 

안에 뭘 담느냐, 얼만큼 큰 상자이냐에 따라 다른것 처럼 우리가 사용하는 데이터도 그렇다.

프로그램은 근본적으로 데이터를 다루는 것인데, 이 데이터를 위한 공간과 우형, 이름 등을 저장해야 한다.

앞에서 말한 상자에 비유해 보겠다.

 만약, 우리가 물류센터에서 일하는데, 1톤 트럭에 물건을 상차 시켜서 배달 준비를 한다고 치자. 

야, 타!

이때, 내가 가야할 행선지에 해당하는 물건들을 차에 싣는데, 오늘따라 물류량이 좀 많다. 
갑자기 사장이 일부 품목은 직접 포장해서 가라고 한다.

그럴 때, 딜레마가 생긴다. 

서로 다른 크기의 박스

박스에 물건을 포장해서 가야 하는데, 물건 크기에 맞게 상자를 일일히 골라서 포장하느니, 그냥 큰 박스만 챙겨서 포장하게 되면 탑차에 싣게되는 물류량이 적어지고, 그렇다고 너무 작은거만 골라오면 쫌쫌따리 언제 다 포장하냐....

다행히, 포장 보조 알바가 있어서, 알바님께서 알아서 포장 해주시고, 안에 든 물품이 유리면 유리, 전자기기면 전자기기 등으로 라벨링까지 해주셧다. 그래서 택배 슝슝~! 끝!

여기서 박스 = 변수 , 라벨링 = 변수명 , 트럭 = 메모리 이다. 

상자에 뭐가 들어가냐에 따라 상자 크기를 다르게 하고, 이름도 다르게 짓는것이, 우리가 프로그래밍을 할때도 똑같이 적용된다.

물론, 프로그램이니 LCD TV, 가구 등으로 하진 안겠지만, 대신 여러 자료형이 있으며 이에따라 할당되는 크기가 다르다.

변수 타입에 따른 크기 (출처 : https://iinomad.com/2 )

우리는 위의 그림처럼, 해당 변수가 얼마의 공간을 가질 수 있는지 (어느정도의 범위를 가지는지)를 고려해서 프로그래밍 해야한다.

1. 변수 선언

변수를 사용하기 전에 콤퓨터에게 "야 나 이거 쓴다." 라고 알려주는 것이다. 

(변수형) (변수 이름) ; 
(EX: int num;)

선언방법은 간단하다. 변수형을 앞에 쓰고, 임의로 정한 이름을 뒤에 쓰는것으로 완료다. 

변수를 선언하면서 동시에 해당 변수에 값을 넣어 줄 수 있다. (이를 초기화 라고 한다.)

int num = 1 ; -> num 이라는 변수명을 가진 int형 변수에 1이 들어감 (num = 1 이됨)

변수를 선언할때 주의점

  1. 가독성을 고려해야 한다.
    (조금 긴 단어를 쓰거나 두 단어가 함쳐진 변수명을 쓸때 두번째 단어 첫번째 클자는 대문자로 쓰자. 이를 camelCase 라고 한다.)
  2. 변수명으로 영문, 숫자 , 특수문자(_, $ 만 가능)을 사용할 수 있고, 영문은 대소문자를 구별한다.
  3. 첫글자가 숫자로 시작하는 변수명은 만들 수 없다.
  4. 이미 사용중인 예약어는 변수명으로 사용 불가능 (EX: byte, class)

 

2. 변수타입 : 상수

상수는 변하지 않는 수를 말한다. PI(3.14...) 등의 변수는 계산 도중 값이 바뀌는것이 좋지 않으므로 이 타입을 이용해서 선언 하는것이 좋다. 

선언 방법

final (변수 타입) (변수명) PI = 3.14;

 

3. 변수타입 : 정수

정수는 쉽게 말해서 소수가 안 붙는 수 라고 생각하면 된다 (-1, 0, 1, ....)

선언 방법

int (변수명);

정수형 자료형은 4byte의 공간이 할당 되므로, 가질 수 있는 숫자의 범위가 정해져 있다. 
위의 표를 참조하면(-2,147,483,648(-231) ~ 2,147,483,647(231 - 1) 까지 가능)

만약 이 범위를 벗어난다면...

오버플로우와 언더플로우 (출처 : 코드스테이츠)

오버플로우

  • 자료형이 표현할 수 있는 범위 중 "최대값" 이상으로 넘어간 경우 발생
  • 최대값을 넘게 되면, 해당 자료형의 "최소값"으로 값이 순환
  • EX: 최소~최대 -500~500의 범위를 가진 자료 형의 경우, 여기에 501을 넣으면 -500으로 값이 변하고, -501을 넣으면 500이 됨 -> 양 끝단으로 이동함 (창조경제)

언더플로우

  • 자료형이 표현할 수 있는 범위 중 "최소값" 이하로 넘어간 경우 발생
  • 최대값을 넘게 되면, 해당 자료형의 "최대값"으로 값이 순환
  • EX: 최소~최대 -500~500의 범위를 가진 자료 형의 경우, 여기에 501을 넣으면 -500으로 값이 변하고, -501을 넣으면 500이 됨 -> 양 끝단으로 이동함 (창조경제)

4. 변수타입 : 실수

실수는 소수를 포함한 값이라고 보면 된다. 

선언 방법

float (변수명);

double (변수명);

위의 2개의 유형이 보이는데, 특징만 말하면 double이 float보다 더 정밀하고, 더 큰 범위를 갖는다.(큰 범위를 가지는 만큼 메모리도 먹기 때문에, 취사선택 해서 쓰자)

오버플로우와 언더플로우 (출처 : 코드스테이츠)

오버플로우

  • 자료형이 표현할 수 있는 범위 중 "양의 최대값" 혹은 "음의 최소값"이상으로 넘어간 경우, 값이 "무한대"로 나오게 됨
  •  

언더플로우

  • 자료형이 표현할 수 있는 범위 중 "음의 최대값", "양의 최소값" 이하로 넘어간 경우, 값이 0으로 나오게 됨

 

5. 변수타입 : 논리타입

선언 방법

boolean (변수명) = ture;

boolean (변수명) = false;

논리타입은 참, 거짓만 저장하는 타입이다.

주로 조건문에 사용된다.

 

6. 변수타입 : 문자타입

선언 방법

char(변수명) = 'a'; (작은 따옴표로 넣고자 하는 문자를 감싸야 한다.)

char 변수명은 "하나"의 문자만 저장 가능하다. 

문자는 유니코드로 저장되기 때문에 특정 값을 갖는다. 이를 이용해서 

char (변수명) = 65 ; 를 선언하면

유니코드 상에서 65는 A 를 의미 하므로 char 변수형에 A가 들어간다. 
(유니코드는 우리가 사용하는 문자를 pc에서 알아먹게 저장해 놓은 것이다. 자세한건  https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%88%EC%BD%94%EB%93%9C)

 

7. 변수타입 : 문자열

문자열은 위의 문자형과 다르게 여러개의 문자를 저장 가능한 변수이다. 

선언 방법

String (변수명) = "넣고자 하는 문자";

String 타입은 좀 특이한게, 값을 저장한다기 보다는 해당 문자열을 저장한 주소값을 저장한다.

이게 무슨말이냐? 싶을 수 있는데 간단한 비유로 

메모가 있다고 하자.

우리가 메모 할 때 특정 문자 (예: 오늘 장 볼 목록 등)을 쓰고 머리속에 기억하진 않는다. 

다만, 메모가 어디 있는지 기억하고, 그 메모를 읽는것 처럼 String 자료형도 어디에 문자열을 기록하고, 어디에 써놧는지 기록해 놓는 것이다.

그래서 변수명이 달라도 값이 똑같으면 주소도 똑같은 일이 발생한다. 

예시 

String name1 = "bop";

String name2 = "bop";

-> 두 변수의 주소가 같아진다! -> 두 변수는 서로 같다! 가 된다. 

이를 방지하려면 

String name1 = new String ("bop");

String name2 = new String ("bop");

위와 같이 new 함수를 써서 서로 다른 곳에 새로 만들게 해야 한다.

 

문자열에서 사용하는 메서드

문자열은 생각보다 많이 다루는 자료형인데, 이 문자열을 다루는 메서드(기능을 가진 코드 라고 보면 된다.)가 있다. 

  1. charAt(숫자) : charAt 메서드를 사용 할 때 괄호 안에 숫자(String에서 ~번째 글자를 보고 싶을 때)을 넣으면 해당 인덱스(순번)의 문자가 튀어나온다. 1번째 글자를 0부터 세기 때문에  이를 고려해야 한다.

  2. concat(문자열) : 다른 문자열과 같이 연결하는 메서드
    EX : String str = "점심메뉴"; -> str.concat("짜장면" ->  이제 str에는 "점심메뉴짜장면" 이 된다.

  3. indexOf(문자) : 해당 문자열에 특정 문자가 어디 위치한지 인덱스를 알려주는 메서드 
    EX : String str = "abc"; -> str.indexOf('b'); -> 1이 나옴 (0부터 세기 때문에)

  4. compareTo(문자) : 문자를 서로 비교해서 사전 편찬순 ( a =1, b = 2..)로 비교하는 메서드, 이 결과값이 0 이면 서로 같은 문자열이고, 비교대상이 원래 것보다 크면 음수, 작으면 양수 출력

  5. toLowerCase() / toUpperCase() : 해당 문자열을 대문자, 소문자로 바꿔즌 메서드

  6. trim(): 해당 문자열의 띄어쓰기, 탭을 제거하는 메서드 (공백을 지워준다.)

 

4. 연산자

자바에는 다양한 연산자를 지원한다.

자바의 연산자 (출처 : https://jokerkwu.tistory.com/96 )

해당 연산자를 모두 설명하기에는 무리가 있다. 

사실 사용하면서 자연스럽게 알게 될 것이다. 

연산자의 우선순위(출처 : https://jokerkwu.tistory.com/96)

우리가 수학 식을 푸는것 처럼 연산자에도 우선순위가 있다.

이 또한 사용하면서 알게 될 것이고, 필요할때 이 표를 보면 된다.