[Java] 기초 상식
시작일 : 2023년 5월 6일
종료일: 2023년 5월 14일
01. 자바 프로그래밍 시작하기
✔️ 프로그래밍 이란?
- 프로그래밍: 컴퓨터가 일을 수행 하도록 프로그래밍 언어로 명령어 집합(프로그램)을 만드는 일
- 컴파일 : 프로그래밍 언어를 컴퓨터가 실행 가는한 기계어로 만드는 일
- 컴파일러 : 기계어로 바꾸어 주는 프로그램 ( ex. 자바 컴파일러, gcc )
✔️ 자바 프로그래밍
- 자바의 역사 : 1991년 제임스 고슬링을 비롯한 선 마이크로 시스템스 연구원들이 처음 개발 가전, 휴대용 장치에 사용되는 소프트웨어 언어로 개발됨. 안정성이 중요
- 자바 프로그래밍의 특징
- 플랫폼에 영향을 받지 않으므로 다양한 환경에서 사용할 수 있다.
- 객체 지향 언어이기 때문에 유지보수가 쉽고 확장성이 좋다.
- 프로그램이 안정적이다.
- 풍부한 기능이 제공되는 오픈 소스이다.
✔️ 객체 지향 프로그래밍이 무엇인가?
- 프로그램의 구현을 시간의 흐름순이 아닌 객체간의 관계와 협력을 기반으로 프로그램 하는 것
- Object oriented programming(OOP) 이라고 함 ( cf. 절차 지향 프로그래밍 procedural programming )
- 사용 하는 언어 : Java, C++, C#, Python, JavaScript, Ruby 등 다수
✔️ 자바로 프로그래밍을 하면 좋은 이유는 뭔가요? (객체 지향 프로그래밍의 장점)
✔️ 자바를 활용한 프로그래밍
- 웹 서버 구현
- 안드로이드 프로그래밍
- 게임 프로그래밍
✔️ 이 과정에서 배워야 할 내용
- 자바 언어 익히기 (문법)
- 객체 지향 프로그래밍 개념을 익히고 자바로 구현하기
- 자료 구조의 필요성을 이해하고 구현하기
- 자바 언어의 정확한 이해를 통한 문제 해결하기(객체지향, 알고리즘 문제 등)
✔️ 용어 정리
JDK(Java Development Kit) : 자바에서 제공되는 개발용 라이브러리. 계속 버젼이 올라가고 있음 JRE(Java Runtime Environment) : 자바 프로그램이 실행되는 환경. 8.0까지 무료로 제공 됨 JVM(Java Virtual Machine) : 자바 가상 머신으로 프로그램이 실행되는 환경인 JRE 가 설치되어 있어야 함
✔️
✔️ 컴퓨터에서 자료 표현식
✔️ 비트로 나타낼 수 있는 수의 범위는?
한 개의 비트로 나타낼 수 있는 수 : 0. 1 (2개) 두 개의 비트로 나타낼 수 있는 수 : 00, 01, 10, 11 (4개) 세 개의 비트로 나타낼 수 있는 수 : 000, 001, 010, 011, 100, 101, 110, 111 (8개)
✔️ 2진수, 8진수, 16진수를 프로그램에서 사용하는 예제
public class BinaryTest {
public static void main(String[] args) {
int num = 10;
//10 진수
int bNum = 0B1010;
//2진수
int oNum = 012;
// 8진수
int xNum = 0XA;
//16진수
//2진수,8진수,16진수 앞에식별자를 작성해야한다.
System.out.println(num);
System.out.println(bNum);
System.out.println(oNum);
System.out.println(xNum);
}
}
0과 1로만 데이터를 저장한다. bit(1비트) : 컴퓨터가 표현하는 데이터의 최소 단위로 2진수 하나의 값을 저장할 수 있는 메모리의 크기 byte(바이트) : 1byte = 8bit
02. 변수(Variable)는 변하는 수입니다.
✔️ 변수는 언제 쓰나요?
- 프로그램에서는 항상 변하는 값을 나타낼 필요가 있음 ( ex. 학생의 성적, 합계, 게임의 레벨, 회원 주소 등등…)
- 표현하려는 수에 맞는 데이타 타입(자료형)을 이용하여 변수를 선언
- 표현하려는 자료가 숫자, 문자, 문자열등 다양할 수 있으므로 그에 맞는 자료형을 사용
✔️ 변수 선언과 사용하기 예제
변수 선언은 자료형과 변수 명으로 선언함 선언과 동시에 초기화 할 수 있음
package ch05;
public class VariableTest {
public static void main(String[] args) {
int age, count;
age = 10;
int level = 10000;
System.out.println(age);
System.out.println(level);
}
}
✔️ 변수의 이름 만들 때…
변수 이름은 영문자(대문자, 소문자)나 숫자를 사용할 수도 있고, 특수문자 중에는 $와 _만 사용 (ex. count100, _master)
변수 이름의 시작은 숫자로 할 수 없음 ( ex. 27days(X), 1abc(X))
자바에서 이미 사용하고 있는 예약어는 사용할 수 없음 (while, break 등)
변수 이름은 프로그램내에서 사용되는 것이므로 그 용도에 맞고 가독성이 좋게 만드는것이 중요 ex) int numberOfStudent;
03. 자료형(data type) - 정수는 어떻게 표현하나요?
✔️ 변수와 메모리
변수를 선언하면 해당되는 자료형의 크기 만큼 메모리가 할당 변수는 할당된 메모리를 가리키는 이름
int level = 10; // 4바이트 정수형 메모리가 level 이라는 이름으로 할당 됨
✔️ 기본 자료형(primitive data type)의 종류
✔️ 정수 자료형의 종류와 크기
✔️ byte와 short
- byte : 1바이트 단위의 자료형 동영상, 음악 파일, 실행 파일의 자료를 처리할 때 사용
- short: 2바이트 단위의 자료형 C/C++ 언어와 호환 시 사용
✔️ int
- 자바에서 사용하는 정수에 대한 기본 자료 형
- 4바이트 단위의 자료형
- 프로그램에서 사용하는 모든 숫자(리터럴)은 int 로 저장됨
- 32 비트를 초과하는 숫자는 long 자료형으로 처리
✔️ long
- 8바이트 자료형
- 숫자의 뒤에 알파벳 L 또는 l 을 써서 long 형임을 표시 함
- 예) int num = 12345678900; // 오류 long lnum = 12345678900; //오류 long lnumber = 12345678900L; // ok
✔️ 형 변환 예제
package ch06;
public class ch06 {
public static void main(String[] args) {
byte bnum = 127;
System.out.println(bnum);
// int num 12345678900;
long lNum = 12345678900L;
System.out.println(lNum);
}
}
int에서 long 타입으로 형 변환 4바이트에서 8바이트로 형 변환은 가능
하지만 8 바이트에서 4바이트로 변환이 불가능하기 때문에 변수 앞에 long을 붙이고 숫자 뒤에 L도는 l을 붙여 형 변환을 시켜준다.
04. 자료형(data type) - 실수는 어떻게 표현하나요?
✔️ 부동 소수점 방식
- 실수는 정수 보다 정밀하기 때문에 정수와는 다른 방식으로 표현해야 함
- 부동 소수점 방식으로 실수 값 0.1 표현
- 지수부와 가수부로 표현 함
- 컴퓨터에서는 밑수를 2로 사용
- 정규화 : 가수가 밑수보다 작은 한 자리까지 가수로 표현 되는 것
- 컴퓨터에서는 밑수가 2 이므로 정규화를 하게 되면 가수부분의 첫 번째 자리 숫자는 항상 1임 예) 0.2 표현 0.4 X 2-1 정규화 하면 1.6 X 2-3
✔️ float형과 double형
자바에서는 실수의 기본 타입은 dobule을 사용 함
✔️ float 와 double 예제
package ch07;
public class DoubleTest {
public static void main(String[] args) {
double dnum = 3.14;
float fnum = 3.14F;
System.out.println(dnum);
System.out.println(fnum);
}
}
실수는 8 바이트 double 플루트는 4바이트 3.14는 실수로 8바이트로 숫자 뒤에 F를 작성하므로 float 타입으로 변환 저장 해라 라는 뜻으로 사용할 수 있으며, float 매개변수형으로 작성했으나 해당 실수가 피라메터 매칭 타입 오류가 나는 경우에는 뒤에 식별자를 꼭 써야 한다.
✔️ 부동 소수점 방식의 오류
지수와 가수로 나타내는 부동 소수점 방식에서는 지수부가 0을 표현할 수 없기 때문에 약간의 오차가 발생할 수 있다
public class DoubleTest2 {
public static void main(String[] args) {
double dnum = 1;
for(int i = 0; i<10000; i++) {
dnum = dnum + 0.1;
}
System.out.println(dnum);
}
}
출력 결과
05. 자료형(data type) - 문자는 프로그램에서 어떻게 표현하여 사용하나요?
✔️ 문자도 정수로 표현합니다.
- 어떤 문자를 컴퓨터 내부에서 표현하기 위해 특정 정수 값을 정의
-
A 는 65
- 문자세트 : 각 문자를 얼마로 표현할 것인지 코드 값을 모아둔 것을 문자세트(charater set)라 함 (ex. ASKII, euc-kr, utf-8, utf-16)
✔️ 자바에서는 문자가 어떻게 표현되나요?
- 자바는 문자를 나타내기 위해 전세계 표준인 UNICODE를 사용
- utf-16 인코딩을 사용 (모든 문자를 2바이트로 표시)
✔️ 문자형 변수 선언과 사용하기
- 문자를 위한 데이터 타입 char ch = ‘A’;
- 내부적으로 숫자료 표현되므로 숫자를 넣어도 문자가 출력될 수 있음 char ch2 = 66;
package ch08;
public class CharacterTest {
public static void main(String[] args) {
char ch1 = 'A';
System.out.println(ch1);
System.out.println((int)ch1);
char ch2 = 66;
System.out.println(ch2);
int ch3 = 67;
System.out.println(ch3);
System.out.println((char)ch3);
//char ch4 = -66; 음수는 대입 할 수 없음
char ch5 = '한';
char ch6 = '\uD55C';
System.out.println(ch5);
System.out.println(ch6);
}
}
char 자료형은 2바이트로 유니코드로 쓰고 내부적으로 정수의 코드값을 가지고 있다. 앞에 -66; 등 음수의 값은 쓸 수 있다.
✔️ 참고
character set: 문자를 숫자로 변환한 값의 세트
encoding: 문자가 숫자로 변환되는 것 decoding: 숫자에서 다시 문자로 변환되는 것
ASKII code: 알파벳과 숫자 특수 문자등을 1바이트에 표현하는데 사용하는 문자세트
UNICODE: 전 세계 표준으로 만든 문자 세트
UTF-8: 1바이트에서 4바이트까지 다양하게 문자를 표현할 수 있음
UTF-16: 2바이트로 문자를 표현
06. 자료형(data type)- 논리형과 자료형 없이 변수 사용하기
✔️ 논리형
- true(참), false(거짓) 두 가지만 나타냄
- 1바이트를 사용 함
- 값이 존재하는지, 배열이 비었는지, 결과가 참인지 거짓인지등을 표현
package ch09;
public class BooleanTest {
public static void main(String[] args) {
boolean isMarried = true;
System.out.println(isMarried);
}
}
✔️ 지역 변수 자료형 없이 사용하기 ( 자바 10 지원 됨 )
- Local variable type inference
- 추론 가능한 변수에 대한 자료형을 선언하지 않음
- 한번 선언하여 추론 된 변수는 다른 타입의 값을 대입 할 수 없음
- 지역 변수만 사용 가능
package ch09;
public class LocalVariableType {
public static void main(String[] args) {
var i = 10;
var j = 10.0;
var str = "hello";
System.out.println(i);
System.out.println(j);
System.out.println(str);
str = "test";
//str = 3;
}
}
str = "hello";
str = 3;
// 문자열을 넣었던 변수를 다시 정수형으로 선언하는 것은 스크립트 언어에서는 가능하지만,
// 자바에서는 불가하다
07. 변하지 않는 상수와 리터럴, 변수의 형 변환
✔️ 상수(constant) 선언하기
- 상수는 변하지 않는 수
- 원주률 3.14, 1년 12개월 등
- final 예약어를 사용하여 선언
- 상수를 사용하면 변하지 않는 값을 반복하여 사용할 때 의미있는 문자로 인식하기 쉽고 혹, 변하더라도 선언한 부분만 변경하면 되므로 여러부분을 수정할 필요가 없음
package ch10;
public class ConstantTest {
public static void main(String[] args) {
final int MAX_NUM = 100;
final int MIN_NUM;
MIN_NUM = 0;
System.out.println(MAX_NUM);
System.out.println(MIN_NUM);
//MAX_NUM = 1000;
}
}
상수는 변하지 않는 수로 일반적으로 대문자로 선언을 한다.
초깃 값을 세팅해주어야 오류가 나지 않는다. 만약 MIN_NUM 값을 0으로 선언한 부분을 주석 처리 한 후 디버깅 해보면 오류가 날 것 이다.
✔️ 리터럴(literal)
- 프로그램에서 사용하는 숫자, 문자, 논리값을 뜻함
- 리터럴은 상수 풀(constant pool)에 있음
- 정수 리터럴은 int 로 실수 리터럴은 double 로 저장됨 정수의 범위가 넘어가는 경우는 L,l을 float로 사용하려는 경우는 F,f 식별자를 써줘야 함
✔️ 형 변환 (type conversion)
- 서로 다른 자료형 간에 연산등의 수행을 위해 하나의 자료형으로 통일하는 것
- 묵시적 형 변환(implicit type conversion, 자동 형 변환)과 명시적 형 변환(explicit type conversion, 강제 형 변환)이 있음
- 바이트 크기가 작은 자료형에서 큰 자료형으로 형 변환은 자동으로 이루어 짐
- 덜 정밀한 자료형에서 더 정밀한 자료형으로읜 형 변환은 자동으로 이루어 짐
package ch10;
public class TypeConversionTest {
public static void main(String[] args) {
byte bNum = 10;
int iNum = bNum;
//자동 형 변환 가능
int iNum1 = 20;
float fNum = iNum2;
//20이라는 값이 형변환 되어 20.0 된다.
int iNum = 10;
byte bNum = (byte)iNum;
//4바이트에서 1바이트로 변환 (Error)
//(byte)를 사용하여 표현할 경우 변환은 가능하지만 자료 유실이 일어난다.
double dNum = 3.14;
int iNum2 = (int)dNum;
//마찬가지로 실수 -> 정수 변환으로 자료 유실이 일어난다.
}
}
✔️ 연산 중 형 변환 예제
package ch10;
public class TypeConversion {
public static void main(String[] args) {
double dNum = 1.2;
float fNum = 0.9F;
int iNum1 = (int)dNum + (int)fNum;
int iNum2 = (int)(dNum + fNum);
System.out.println(iNum1);
System.out.println(iNum2);
}
}
iNum1 의 경우 dNum과 fNum 을 정수로 변환 후 더했기 때문에 값은 1이 된다.
iNnm2의 경우 dNum과 fNum 을 더한 후 정수 변환했기 때문에 값은 2가 나오게 된다.
08. 자바의 연산자들 -1 (대입, 부호, 산술, 복합대입, 증감연산자)
✔️ 항과 연산자
- 항(operand) : 연산에 사용되는 값
- 연산자 (operator) : 항을 이용하여 연산하는 기호
- 단항 연산자의 순위가 가장 높다.
✔️ 대입 연산자 (assignment operator)
- 변수에 다른 변수나 값을 대입하는 연산자
- 이항 연산자 중 우선 순위가 가장 낮은 연산자들
- 왼쪽 변수 = 오른쪽 변수(또는 식, 값)
Lvalue 와 Rvalue 가 있다 .
다른 연산자 보다 우선 순위가 상당이 낮다.
✔️ 부호 연산자
- 단항 연산자
- 변수의 부호를 유지 하거나(+) 바꿈(-)
- 실제 변수의 부호가 변하려면 대입 연산자를 사용해야 함
✔️ 산술 연산자
- 사칙 연산자
- % 나머지 구하는 연산자, 숫자 n 의 나머지 범위는 0 ~ n-1
✔️ 복합 대입 연산자
- 대입 연산자와 다른 연산자가 함께 쓰임
✔️ 증가, 감소 연산자
- 단항 연산자
- 변수의 값을 1 더하거나 1 뺄때 사용
- 연산자가 항의 앞에 있는가 뒤에 있는가에 따라 연산 시점과 결과가 달라짐
- 문장(statement)의 끝(;)을 기준으로 연산 시점을 생각해야 함
단항 연산자의 순위가 가장 높고, 대입연산자의 순위는 낮다.
09. 자바의 연산자들 -2 (관계, 논리 연산자)
✔️ 관계 연산자
- 이항 연산자
- 연산의 결과가 true(참), false(거짓)으로 반환 됨, 비교연산자 라고도 함
-
조건문, 반복문의 조건식으로 많이 사용 됨
package ch12;
public class RealtionalTest {
public static void main(String[] args) {
int num1 = 5;
int num2 = 3;
boolean value = (num1 > num2);
System.out.println(value);
System.out.println(num1 < num2);
System.out.println(num1 >= num2);
System.out.println(num1 <= num2);
System.out.println(num1 == num2);
System.out.println(num1 != num2);
}
}
✔️ 논리 연산자
- 관계 연산자와 혼합하여 많이 사용 됨
-
연산의 결과가 true(참), false(거짓)으로 반환 됨
package ch12;
public class LogicalTest {
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
boolean flag = (num1 > 0) && (num2 > 0);
System.out.println(flag);
flag = (num1 < 0) && (num2 > 0);
System.out.println(flag);
flag = (num1 > 0) || (num2 > 0);
System.out.println(flag);
flag = (num1 < 0) || (num2 > 0);
System.out.println(flag);
flag = !(num1 > 0);
System.out.println(flag);
}
}
✔️ 논리 연산에서 모든 항이 실행되지 않는 경우 - 단락 회로 평가 (short circuit evaluation)
- 논리 곱(&&)은 두 항의 결과가 모두 true일 때만 결과가 true
-
- 앞의 항의 결과가 false이면 뒤 항의 결과를 평가하지 않음
-
-
논리 합( )은 두 항의 결과가 모두 false일 때만 결과가 false -
- 앞의 항의 결과가 true이면 뒤 항의 결과를 평가하지 않음
-
package ch12;
public class ShortCircuit {
public static void main(String[] args) {
int num1 = 10;
int i = 2;
boolean value = ((num1 = num1 + 10 ) < 10) && ( ( i = i + 2 ) < 10);
System.out.println(value);
System.out.println(num1);
System.out.println(i);
value = ((num1 = num1 + 10 ) < 10) || ( ( i = i + 2 ) < 10);
System.out.println(value);
System.out.println(num1);
System.out.println(i);
}
}
10. 자바의 연산자들 -3 (조건 연산자, 비트 연산자)
✔️ 조건 연산자
- 삼항 연산자
- 조건식의 결과가 true(참)인 경우와 false(거짓)인 경우에 따라 다른 결과가 수행됨
-
if (조건문)을 간단히 표현할 때 사용 할 수 있음
package ch13;
import java.util.Scanner;
//스캐너가 util 라이브러리에 있다.
public class ConditionTest {
public static void main(String[] args) {
int max;
System.out.println("입력 받은 두 수중 큰 수를 출력하세요\n ");
Scanner scanner = new Scanner(System.in);
System.out.println("입력1:");
int x = scanner.nextInt();
System.out.println("입력2:");
int y = scanner.nextInt();
max = (x > y)? x : y);
System.out.println(max);
}
}
System.in > 표준 자바 입출력
✔️ 비트 연산자
- 대입연산자와 다른 연산자가 함께 쓰임
- 마스크 : 특정 비트를 가리고 몇 개의 비트 값만 사용할 때
- 비트켜기 : 특정 비트들만을 1로 설정해서 사용하고 싶을 때 예) & 00001111 ( 하위 4비트 중 1인 비트만 꺼내기)
- 비트끄기 : 특정 비트들만을 0으로 설정해서 사용하고 싶을 때 예) | 11110000 ( 하위 4비트 중 0 인 비트만 0으로 만들기)
-
비트 토글 : 모든 비트들을 0은 1로, 1은 0으로 바꾸고 싶을 때
package ch13;
public class BitTest {
public static void main(String[] args) {
int num1 = 5; // 00000101
int num2 = 10; // 00001010
System.out.println(num1 | num2);
System.out.println(num1 & num2);
System.out.println(num1 ^ num2);
System.out.println(~num1);
System.out.println(num1 << 2);
System.out.println(num1);
System.out.println(num1 <<= 2);
System.out.println(num1);
}
}
✔️ 연산자 우선순위
11. 조건문 - if 문(만약에… 라면)
✔️ 조건문 이란?
- 주어진 조건에 따라 다른 실행이 이루어 지도록 구현
- ‘재산이 1억 이상이면 100만원을 세금으로 낸다 그렇지 않으면 내지 않는다’ 를 구현 한다면
만약에 (재산이 1억 이상이면){ 세금을 100만원 낸다 } 그렇지 않으면 { 세금을 내지 않는다 }
- if문 문법
if(조건식){ 수행문; // 조건식이 '참'인 경우에(조건에 맞는 경우) 수행문이 수행됨 } // 조건식이 '참'이 아니면(조건에 맞지 않는 경우) 수행문이 수행되지 않음
- if - else 문 문법
if( 조건식) { 수행문1; // 조건식이 '참'인 경우에 수행됨 } else{ 수행문2; // 조건식이 '참'이 아닌 경우에 수행됨 }
- if - else 예제
package ch14; import java.util.Scanner; public class IfElseTest { public static void main(String[] args) { int age = 7; //Scanner scanner = new Scanner(System.in); //int age = scanner.nextInt(); if( age >= 8) { System.out.println("학교에 다닙니다"); } else { System.out.println("학교에 다니지 않습니다."); } } }
✔️ if-else if-else 문
- 하나의 상황에 대한 조건이 여러개로 나뉘고 각 조건에 다른 수행이 이루어져야 할 경우 사용
- 각 조건은 상호 배타적임
if(조건식1){ 수행문1; // 조건식1이 '참'인 경우 수행하고 전체 조건문을 빠져나감 } else if(조건식2){ 수행문2; // 조건식2이 '참'인 경우 수행하고 전체 조건문을 빠져나감 } else if(조건식3){ 수행문3; // 조건식3이 '참'인 경우 수행하고 전체 조건문을 빠져나감 } else{ 수행문4; // 위 조건이 모두 해당되지 않는 경우 수행됨 (디폴트 조건) } 수행문5; // if-else if-else 문이 끝나면 수행됨 가령 조건식2가 만족되면 수행문2 -> 수행문5 순으로 수행됨
package ch15;
public class IfElseIfElseTest {
public static void main(String[] args) {
int age = 12;
int charge;
if(age < 8){
charge = 1000;
System.out.println("미 취학 아동입니다.");
}
else if(age < 14){
charge = 2000;
System.out.println("초등학생 입니다.");
}
else if(age < 20){
charge = 2500;
System.out.println("중, 고등학생 입니다.");
}
else{
charge = 3000;
System.out.println("일반인 입니다.");
}
System.out.println("입장료는 " + charge + "원입니다.");
}
}
✔️ 실습
package java001;
import java.util.Scanner;
public class ch14 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//int age = 12;
System.out.println("나이를 입력하세요");
int charge = 3000;
Scanner scanner = new Scanner(System.in);
int age= scanner.nextInt();
if( age < 8) {
charge = 1000;
System.out.println("미 취학 아동니다." );
}
else if (age < 14) {
charge = 2000;
System.out.println("초등학생입니다.");
}
else if(age < 20 ) {
charge = 2500;
System.out.println("중, 고등학생입니다.");
}
else {
System.out.println("일반인입니다.");
}
// default
System.out.println("입장료는" + charge + "입니다.");
}
}
학습한 내용을 바탕으로 scanner 함수를 이용하여 사용자 값을 입력 받고, 그에 맞는 조건을 if, else 문을 통하여 출력 되게 설계했다.
위의 실습 코드를 실행하면 나오는 화면
나이를 입력하면 해당 값을 바탕으로 설계된 구문이 출력된다.
✔️ if-else if 문과 if - if 문의 차이점
- if- else if 를 사용하는 경우 하나의 조건이 만족 되면 나머지 else if 부분은 수행되지 않음
- if - if 로 사용하게 되면 각각 다른 조건 문으로 해석되어 각각 수행하게 됨 ( 위 예제를 if 로 모두 바꾸어 봅시다.)
package ch15;
public class IfIfTest {
public static void main(String[] args) {
int age = 12;
int charge;
if(age < 8){
charge = 1000;
System.out.println("미 취학 아동입니다.");
}
if(age < 14){
charge = 2000;
System.out.println("초등학생 입니다.");
}
if(age < 20){
charge = 2500;
System.out.println("중, 고등학생 입니다.");
}
else{
charge = 3000;
System.out.println("일반인 입니다.");
}
System.out.println("입장료는 " + charge + "원입니다.");
}
}
if - fi 로 코드를 작성하게 되면 배타적인 체크 보다는 무조건의 성립이 일어나게 된다.
✔️ 하나의 상황에 의해 여러 조건이 필요하다면 if-else문을 사용하게 되는 것이고,
✔️각각의 조건을 따로따로 비교할 목적이라면, if- if 문을 써도 무방하다.
12. 조건이 여러 개 일 때 간단히 표현되는 switch-case 문
switch - case 문
- if - else if - else 문을 사용할 때 복잡하고 번거로운 부분을 가독성 좋게 구현
- 비교 조건이 특정 값이나 문자열인 경우 사용
- break 문을 사용하여 각 조건이 만족되면 switch 블럭을 빠져나오도록 함
- 자바 14부터 좀 더 간결해진 표현식이 지원 됨 ( break 사용하지 않음 )
✔️ 한 달이 며칠인지 알려주는 프로그램 구현
package ch16;
public class SwitchCaseTest {
public static void main(String[] args) {
int month = 10;
int day;
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
day = 31;
break;
case 4: case 6: case 9: case 11:
day = 30;
break;
case 2:
day = 28;
break;
default:
day = 0;
System.out.println("존재하지 않는 달 입니다.");
}
System.out.println(month + "월은 " + day + "일입니다.");
}
}
✔️ 문자열 지원되는 switch - case 문
package ch16;
public class SwitchCaseTest2 {
public static void main(String[] args) {
String medal = "Gold";
switch(medal) {
case "Gold":
System.out.println("금메달 입니다.");
break;
case "Silver":
System.out.println("은메달 입니다.");
break;
case "Bronze":
System.out.println("동메달 입니다.");
break;
default:
System.out.println("메달이 없습니다.");
break;
}
}
}
✔️ Java 14 부터 지원 되는 Switch Expression
- 간단하게 쉼표(,)로 조건 구분
- 식으로 표현 하여 반환 값을 받을 수 있음. 리턴 값이 없는 경우는 오류가 생김
- yield 키워드 사용
package ch16;
public class SwitchCaseUpTest {
public static void main(String[] args) {
int month = 3;
int day = switch (month) {
case 1, 3, 5, 7, 8, 10,12 -> {
System.out.println("한 달은 31일입니다.");
yield 31;
}
case 4,6,9,11 -> {
System.out.println("한 달은 30일입니다.");
yield 30;
}
case 2 ->{
System.out.println("한 달은 28일입니다.");
yield 28;
}
default->{
System.out.println("존재하지 않는 달 입니다.");
yield 0;
}
};
System.out.println(month + "월은 " + day + "일입니다.");
}
}
13. 반복문 - while문
✔️ 조건이 참(true)인 동안 반복수행하기
- 주어진 조건에 맞는 동안(true) 지정된 수행문을 반복적으로 수행하는 제어문
- 조건이 맞지 않으면 반복하던 수행을 멈추게 됨
- 조건은 주로 반복 횟수나 값의 비교의 결과에 따라 true, false 판단 됨
- 예) 달리는 자동차, 일정 횟수 만큼 돌아가는 나사못, 특정 온도까지 가동되는 에어컨등
✔️ while문
- 수행문을 수행하기 전 조건을 체크하고 그 조건의 결과가 true인 동안 반복 수행
✔️ while 문 예제
- 1부터 10까지 더하여 그 결과를 출력해 보자
package java001;
public class ch17 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int num = 1;
int sum = 0;
// int sum;
// 지역변수는 자동으로 초기화 되지 않는다. 꼭 초기화 해야한다.
while( num <= 10) {
sum += num;
num++;
}
System.out.println(sum);
System.out.println(num);
}
}
✔️ 무한 반복 할 때
while(true){
.......
}
14. 반복문 - do-while문
✔️ 조건과 상관 없이 한번은 수행문을 수행
-
while문은 조건을 먼저 체크하고 반복 수행이 된다면, do-while은 조건과 상관 없이 수행을 한 번 하고나서 조건을 체크
- 조건이 맞지 않으면(true 가 아니면) 더 이상 수행하지 않음
✔️ do-while 예제
- 입력받는 모든 숫자의 합을 구하는 예제 단, 입력이 0이 되면 반복을 그만하고 합을 출력
package java001;
import java.util.Scanner;
public class ch18 {
public static void main(String[]args) {
Scanner scanner = new Scanner(System.in);
int input;
// 입력 받을 값의 주머
int sum = 0;
//계속 더할 것 이기 때문에 이니셜라이즈를 0으로 설정한다.
do {
input = scanner.nextInt();
sum += 2;
// 입력을 먼저 받는다
}while (input != 1);
System.out.println(sum);
}
}
do 문은 게속 실행이 되고 while문이 참이 되면 수행을 종료한다.
15. 반복문 - for 문
✔️ for문의 수행 순서
✔️ for문 예제 (while과 비교)
- 1부터 10까지 더한 결과를 출력하세요
package ch19;
public class ForTest {
public static void main(String[] args) {
int count =1;
int sum = 0;
for( int i = 0 ; i<10; i++, count++) { //10번
sum += count;
//count++;
}
System.out.println(sum);
int num = 1;
int total = 0;
while( num <= 10) {
total += num;
num++;
}
System.out.println(total);
}
}
✔️ 각 반복문은 주로 언제 사용하나요?
✔️ for문의 문장들은 생략가능 합니다.
- 초기화식 생략 : 이미 이전에 값이 초기화 되어 for 내부에서 값을 지정할 필요가 없는 경우
- 조건식 생략 : 반복 수행에 대한 조건이 수행문 내부에 있는 경우
- 증감식 생략 : 증감식에 대한 연산이 복잡하거나 다른 변수의 연산 결과값에 결정되는 경우
- 무한 반복
✔️ 참고
i+1 과 i++은 다릅니다.
i+1 자체는 i 값이 증가되지 않습니다. 증가하기 위해서는 대입연산자를 써야합니다.
하지만 i++은 i = i+1, i+=1 과 동일한 의미입니다.
따라서 값을 1씩 증가하려고 한다면 i++을 사용하세요
16. 반복문이 여러 번 포개진 중첩 반복문
✔️ 중첩 반복문이란?
- 반복문 내부에 또 다른 반복문이 있음
- 여러 겹으로 반복문을 겹쳐서 구현 가능 (단 수행시간에 문제가 발생할 수 있음)
- 외부 반복문과 내부 반복문 간의 변수 값 변화에 유의 하며 구현하여야 함
✔️ 구구단을 for와 while로 구현해 보자
package ch20;
public class NestedLoopTest {
public static void main(String[] args) {
int dan = 2;
int count = 1;
for( dan = 2; dan <= 9; dan++) {
for(count = 1; count <=9; count++) {
System.out.println( dan + "X" + count + "=" + dan * count);
}
System.out.println();
}
dan = 2;
while( dan <= 9 ) {
count = 1;
while (count <= 9) {
System.out.println( dan + "X" + count + "=" + dan * count);
count++;
}
dan++;
System.out.println();
}
}
}
✔️
17. 중간에 멈추는 break문, 무시하고 계속 진행하는 continue문
✔️ break문 사용하기
- 감싸고 있는 제어문의 블록을 빠져 나오는 기능 (switch문 에서도 사용)
- 반복문에서는 주로 조건문(if)와 같이 사용하여 조건에 해당되는 경우 반복 수행을 멈추고 반복문 외부로 수행이 이동
- 여러 반복문이 중첩되어 있는 경우엔 break 문이 포함되어 있는 반복문만 빠져 나옴
✔️ break문 예제
- 1부터 숫자를 더하여 100이 넘는 순간의 그 숫자와 합을 출력하세요
package ch21;
public class BreakTest {
public static void main(String[] args) {
int sum = 0;
int num;
for( num = 1; ; num++) {
sum += num;
if( sum >= 100) break;
}
System.out.println(sum);
System.out.println(num);
}
}
✔️ continue문 사용하기
- 반복문 내부에서 조건문(if)와 같이 사용하며, 조건이 맞는 경우(true 이면) 이후 반복문 블럭 내부의 다른 수행문들을 수행하지 않음
✔️ continue문 예제
- 1부터 100까지 숫자 중 3의 배수를 출력하세요
Leave a comment