///////
Search
📖

상수, 리터럴, 형변환, 연산자, 반복문, 배열

태그
java
URL
날짜
2022/09/21

상수와 리터럴(constant & literal)

상수: 변하지 않는 값
변수처럼 ‘값을 저장할 수 있는 공간’이지만, 변수와 달리 한 번 값을 저장하면 다른 값으로 변경할 수 없다.
변수의 타입 앞에 final을 붙여준다.
final int MAX_SPEED = 10;
Java
복사
상수는 선언과 동시에 초기화해야 한다.
상수의 이름은 대문자로 하는 것이 암묵적인 관례이다.
여러 단어로 이루어져있는 경우 ‘_’로 구분한다.
리터럴: 변수에 대입하는 상수 데이터
원래 12, 2022, ‘a’와 같은 값이 ‘상수’인데, 프로그래밍에서는 상수를 ‘값을 한 번 저장하면 변경할 수 없는 저장공간’으로 정의하였기 때문에 이와 구분하기 위해 상수를 다른 이름으로 불러야만 했다. 그래서 상수 대신 리터럴이라는 용어를 사용한다. 우리가 기존에 알고 있던 ‘상수’의 다른 이름이라고 생각하면 된다.
int year = 2021; final int MAX_VALUE = 100; year -> 변수: 하나의 값을 저장하기 위한 공간 MAX_VALUE -> 상수: 값을 한 번만 저장할 수 있는 공간 2021, 100 -> 리터럴: 그 자체로 값을 의미하는 것
Java
복사
상수가 필요한 이유?
Int triagleArea = (20*10) / 2; //삼각형 면적 구하는 공식 int rectangleArea = 20*10; //사각형 면적 구하는 공식
Java
복사
이 코드를
final int WIDTH = 20; //폭 final int HEIGHT = 10; //높이 Int triagleArea = (WIDTH * HEIGHT) / 2; //삼각형 면적 구하는 공식 int rectangleArea = WIDTH * HEIGHT; //사각형 면적 구하는 공식
Java
복사
이렇게 리터럴에 ‘의미있는 이름’을 붙여 상수를 만들면 코드 이해와 수정이 쉽다. 이전 코드처럼 작성하면 폭, 넓이 달라질 때마다 하나 하나 찾아서 고쳐야되니까 수정이 어려움.

형변환 = casting

casting, 형태의 변환 등으로 불리며, 데이터 타입 변경을 의미한다.
기본적으로 연산은 같은 데이터 타입간에만 가능하다. 그러나 서로 다른 타입간에도 연산을 해야 하는 상황.. 옵니다.. 반드시..
기본형(primitive type)은 기본형으로만 형변환이 가능하고, 참조형(reference type)은 참조형으로만 형변환이 가능하다.
단, boolean 타입은 형변환이 불가능함을 알아두자.

형변환 방법

변수 A = (형변환할 데이터타입명) 변수 B;
JavaScript
복사

강제 형변환

int num = 10; long num2 = 10L; num = num2; -> 강제 형변환
Java
복사
intlong을 구겨 넣을 때, 강제로 형변환을 해줘야 하는 이유는 다음과 같다.
int는 4byte, long은 8byte이다. 똑같은 정수 10이지만, 8byte를 4byte에 넣을 수는 없다. 따라서 개발자가 ‘강제’로 ‘형변환’ 해줘야 하는 것이다.
또한, 큰 타입에서 작은 타입으로 형변환 하는 것이기 때문에, 값 손실(loss of data)이 발생할 수 있다. 값이 변화할 수도 있다는 의미이다.
int -> byte 형변환 int i = 300; byte b = 10; b = (byte)i; //byte는 1byte int는 4byte
Java
복사

자동 형변환

작은 타입에서 큰 타입으로의 변환은 컴파일러가 자동으로 처리해준다.
int num = 10; long num2 = 10L; num2 = num; -> 자동 형변환
Java
복사
작은 타입을 큰 타입으로 형변환하는 것이므로, 자동 형변환이 가능하다. 당연히 값 손실도 없다.
byte(1byte) → short, char(2byte) → int(4byte) → long(8byte) → float(4byte) → double(8byte)

연산자

연산자 operator 피연산자 operand
연산자에는 우선순위가 존재한다.
단항 > 이항 > 삼항. 단항 연산자의 우선순위가 이항 연산자보다 높다.
1.
대입 연산자 =
대입 연산자란 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용되는 연산자이다.
‘우측의 결과값을 좌측에 대입하라’는 의미
연산자 중 가장 낮은 우선 순위에 해당한다.
변수 =int num = 2+3; -> 왼쪽에서 오른쪽으로 읽는다. 1. int 타입의 num 변수를 선언하고 (int num;) 2. 2+3을 한 후 (2+3) 3. 그 결과값을 num에 대입한다. (num = 5;)
Java
복사
x=y=3; y=3 먼저 수행 그 다음에 x=y; 수행
Java
복사
x = 3; x를 lvalue(left value, 왼쪽 값) 3을 rvalue(right value, 오른쪽 값)라고 한다. lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 한다. 리터럴이나 상수같이 값을 저장할 수 없는 것들은 lvalue가 될 수 없다.
2.
산술 연산자
a.
+
i.
산술 연산
일반적인 숫자 계산에 사용한다. ex) 10+20=30
ii.
연결 연산
String(문자) + Primitive(기본형)을 + 연결 연산자로 연결하면 연결된 값이 나옴.
문자열 + any type → 문자열 + 문자열 → 문자열
any type + 문자열 → 문자열 + 문자열 → 문자열
System.out.println("1" + 1 + 1); -> "1" + 1 = "11" -> "11" + 1 = "111" System.out.println("1" + 'a'); -> 1a System.out.println(1+1+"1"); -> 21 System.out.println("1" + (1+1) ); -> 12 7 + " " -> "7 " 7 + 7 + "" -> 14 + "" -> "14" "" + 7 + 7 -> "7" + 7 -> "77"
Java
복사
b.
- (빼기)
c.
* (곱하기)
d.
/ (몫을 구하는 연산자)
피연산자가 정수형인 경우, 나누는 수로 0을 사용할 수 없다. 에러남.
e.
% (나머지를 구하는 연산자)
int num = 5/2 -> num = 2 () int num2 = 5%2 -> num2 = 1 (나머지)
JavaScript
복사
3.
비교 연산자 (관계 연산자) 비교 연산의 결과는 yes 또는 no임. 즉, true or false의 논리값(boolean)으로 반환 된다. 따라서 비교 연산의 결과는 boolean
a.
>, <, >=, <=
b.
==, !=
4.
논리 연산자
boolean 타입끼리 연산하는 것 (숫자 X)
결과는 당연히 boolean 타입, 즉, true나 false로 나온다.
a.
and 연산자 &&
‘그리고’라는 의미
or 연산자보다 높은 우선수위
모두 충족해야 할 때 사용한다. ex) id==1234 && pw==5678;
→ 추가 설명: false && true && true라면.. 앞에 false && true 먼저 계산한 결과가 false가 나오니까, 마지막 true는 그대로 스루해버림
b.
or 연산자 ||
‘또는’으로 사용되는 연산자 (역슬러쉬)
둘 중 하나만 만족하면 될 때 사용한다.
c.
not 연산자 !
부정의 의미로 사용된다.
!boolean과 같음 ex) !true의 결과는? false
5.
증감 연산자
피연산자에 저장된 값을 1 증가 또는 감소시키는 연산자
누적 합계를 계산할 때 sum = sum + 1로 표현할 수 있는데, 이를 sum++로 간단하게 표현할 수 있는 것임.
a.
선행(전위형, prefix)
값이 참조되기 전에 증가시키는 것.
++변수, --변수와 같이 변수 앞에 연산자를 붙여서 사용한다.
우선순위가 높다
b.
후행(후위형, postfix)
값이 참조된 후에 증가시키는 것.
변수++, 변수--
대입연산자 보다 우선 순위가 낮다.
int sum = 0; <후위형 증감> System.out.println(sum++); 우선순위가 낮은 후위형++ 따라서 sum이 먼저 프린트 되고, 그 다음 sum++가 진행됨. -> 콘솔에는 0이 찍힌다. 한 번 더 출력하면? System.out.println(sum); -> 1 위에 sum++가 발생했으니까 반영된 1의 값이 출력됨. <선위형 증감> System.out.println(++sum); sum에 증가 먼저 시키고, 그 다음 프린트해라. -> 2
Java
복사
<후위 증감> int i=5; int j=0; j = i++; (대입 연산자보다도 우선 순위가 낮은 후위) System.out.println(i); System.out.println(j); 결과 -> i = 5; -> j = 6;
Java
복사
<선위 증감> int i=5; int j=0; j = ++i; System.out.println(i); System.out.println(j); 결과 -> i = 6; -> j = 6;
Java
복사
c.
단독 사용
독립적인 하나의 문장으로 쓰이면, 선행과 후행의 의미가 없어진다.
단독으로 더 많이 사용한다고 함.
<단독 사용> int sum=0; sum++; -> sum=sum+1; 과 같은 의미. 따라서, sum=1 ++sum;으로 해도 결과는 같음 sum--; -> sum=sum-1; 과 같은 의미. 따라서, sum=0 System.out.println(sum); -> 0
Java
복사
int sum = 0; //초기화 int num = sum++; sum++가 후행 증가 연산자여서 대입(=) 먼저 실행됨. 따라서 num에는 0이 들어감. System.out.println(num); -> 0 System.out.println(sum); -> 1
Java
복사
6.
확장된 대입 연산자 (복합 대입 연산자)
sum = sum + 2; 이렇게 sum 두 번 쓰기 귀찮아서.. sum + = 2; sum = sum % 5; 이거는 sum % = 5;
Java
복사
ex) a = a + b; 이거를 a += b; 이렇게 표현 a=a-b; --> a -= b;
Java
복사
7.
삼항 연산자
int a = (1>3) ? 10 : 30; 1>3false니까 a = 30;
JavaScript
복사

반복문

반복문은 어떤 작업을 반복적으로 수행해야할 경우에 사용한다.

for문

반복해야 하는 횟수가 정해져 있을 때 적합하다.
for(초기식;조건식;증감식){ 조건식이 true일 때 수행될 문장을 적는다. }
Java
복사
초기식, 조건식, 증감식을 무조건 적어야 하는 건 아니다. 만약 다 생략하면.. 무조건 true가 나와서 무한 반복이 되겠지.
코드를 진행하다가 for문을 만나면
우선 1) 초기식을 진행하고 2) 조건식을 진행한다.
3) 조건식이 true라면 중괄호{} 속 코드를 실행한다.
이후 4) 증감식을 진행하고 다시 2) 조건식으로 넘어가고.. 무한반복
5) 조건식이 false라면 for문은 바로 종료되고 다음 코드로 넘어간다. 끝
for(int i = 0; i < 5; i=i+2){ 0,2,43번 반복 } for(int i = 1; i <= 5; i++){ 1,2,3,4,55번 반복 }
Java
복사
ex) 2*1=2, 2*2=4 ... 구구단을 출력하고 싶음. 출력하고 싶은 단수를 입력받아 구구단을 출력하자. Scanner sc = new Scanner(System.in); System.out.println("구구단을 외자 구구단을 외자."); int num = sc.nextInt(); for(int i = 1; i < 10; i++){ System.out.println(num + "*" + i + "=" + num * i); }
Java
복사

이중for문

for(int i=0; i<2; i++){ for(int j=0; j<3; j++){ } }
Java
복사
ex) 이중 for문 구구단 2단부터 9단까지 모두 출력 Scanner sc = new Scanner(System.in); for(int i= 2; i < 10; i++) { for(int j= 1; j< 10; j++){ System.out.println(i + "*" + j + "=" + i * j); } }
Java
복사
ex) 별찍기 for(int i=0; ){ for(){ } }
Java
복사

while문

반복할 횟수를 아는 경우 for문이 용이한 반면, 몇 번을 반복해야할 지 정확히 모르는 경우에는 while문을 사용하는 것이 유리하다.
조건식이 false가 될 때까지 끝나지 않는 반복문이기 때문에 무한루프에 유의해야한다.
조건식은 true와 false 즉, boolean 값이 도출되는 조건식을 넣어야 한다.
while(조건식){ //수행될 문장 }
Java
복사
조건식을 판단한 후
거짓(false)이면 while문이 종료된다.
참(true)이면 블럭{ } 안의 문장을 수행한 후 다시 조건식으로 돌아간다. (조건식이 거짓이 될 때까지 반복한다)
예제 코드 public static void main(String[] args){ int num = 0; while(num<5){ System.out.println("I like Java" + num); num++; } }
Java
복사
콘솔창 I like Java0 I like Java1 I like Java2 I like Java3 I like Java4
Java
복사
예제를 통해 변수 num이 5가 될 때 조건식을 충족하지 못하여 while문이 종료됨을 알 수 있다.

do-while문

기본적인 구조는 while문과 같으나 조건식과 블럭{ }의 순서를 바꿔놓은 것이다.
do { //조건식이 참일 때 수행될 문장 } while (조건식);
Java
복사
1.
블럭{ } 먼저 실행
2.
조건식 판단 후
a.
true라면 블럭 { } 실행
b.
false라면 do-while문 종료
→ true, false 구분 없이 일단 블럭 먼저 실행되니까, 최소 한 번은 문장을 실행한다. (while문은 조건식에 따라 블럭이 한 번도 수행되지 않을 수도 있는데)

배열

변수에는 하나의 값만을 저장할 수 있음. 1변수 1데이터
그런데 이 금기를 깨는 것이 바로 배열이다..
배열은 하나의 변수로 여러 개의 데이터를 다룰 때 사용
같은 데이터 타입을 여러 개 묶을 때 사용
배열 선언 시, 크기(길이 또는 length)를 지정해야 한다. (데이터 몇 개 담을 건지)
선언 이후, 크기 수정은 불가능하다.
크기 수정하고 싶으면? 새로운 배열 선언하고 값도 다시 복붙해야함.

1. 배열 선언 방법(문법)

a. 모으려고 하는 데이터타입 [ ] 변수명; -> 모으려고 하는 데이터타입 [ ] 변수명 = new 모으려고 하는 데이터타입[숫자]; ex) int [ ] numbers; int [ ] numbers = new int [3];
Java
복사
b. 모으려고 하는 데이터타입 [ ] 변수명 = new 모으려고 하는 데이터타입[숫자]; ex) int [] numbers = new int [3];
Java
복사
c. 모으려고 하는 데이터타입 [ ] 변수명 = {1,2,3 ...} ex) int [] numbers = {10, 20, 30};
Java
복사

2. 배열 사용(접근) 방법

index 번호를 사용한다.
인덱스 번호는 0부터 시작하고 1씩 증가한다.
배열의 변수명 [인덱스 번호] =; 으로 값 넣을 수 있음.
Java
복사

3. 배열의 크기(length)를 알 수 있는 방법

배열의 크기(length, 길이)를 담는 변수가 있는데, 그거 사용하면 됨.
배열의변수명.length
Java
복사
문제