본문 바로가기
  • 달려가보자고~!
개발공부/Java/Spring

내가 정리한 Java의 기초(1)

by 도전왕 2023. 4. 4.

 

 

  • 개발 언어의 역사.
    - A 언어
      ㄴ 첫 개발언어라는 의미. A Programming Language의 약자.
      ㄴ 1960'
      ㄴ 입/출력, 문맥.
      ㄴ 프로그램을 만들기 위해 기본적으로 필요한 기능 입/출력, 문맥 기능만 구현가능.

    - B 언어
      ㄴ Bell 사에서 개발.
      ㄴ 1960'
      ㄴ A언거 기능 + 기계식 데이터 타입, 연산기능, 메서드.
      ㄴ A언어 기능에 데이터를 담을 수 있는 타입이 생김, 데이터를 연산하고 묶어서 관리할 수 있는 메서드 구현이 가능.

    - C 언어
      ㄴ B언어에 비해 더 좋은 언어라는 의미.
      ㄴ 1970'
      ㄴ B언어 기능 + 자료형 데이터 타입, 자료구조.
      ㄴ B언어 기능에 다양한 데이터 타입을 정의하고 자료구조에 담을 수 있음.

    - Java
      ㄴ 어디서나 마시는 커피처럼 어디서나 동작 가능한 자바 커피에서 이름을 따옴.
      ㄴ 1990'
      ㄴ C언어 기능 + 공통 실행환경, 클래스, 객체.
      ㄴ C언어 기능에 여러 기기에서 실행가능하도록 도와주는 공통 실행환경, 데이터와 메서드를 담는 클래스를 통해 객체를 만듦.

 

  • Why Java?
    - 공통 실행환경.
      ㄴ 여러 기기의 운영 체제에서 실행할 수 있는 언어.
      ㄴ 특히 애플리케이션(모바일, 서버 등) 개발에 적합.

    - 세상과 닮아있는 개발언어라 코드를 이해하기 쉽고 유지 보수가 쉬움.
      ㄴ 존재하는 물건을 "객체"라 부르는 세상을 닮도록 만든 객체언어.
      ㄴ 클래스를 통해 객체를 만듦.

    - 안정성이 높아서 프로그래밍 오류를 방지하고 보안상 안전.
      ㄴ 작성된 문맥을 바이트 코드로 변환하는 변환기(compiler)가 먼저 오류를 체크.
      ㄴ 지원하는 보안 기술이 많음.

    - 대규모 앱 개발 가능.
      ㄴ 네트워크 및 데이터베이스 연결, 통신 등의 작업을 처리하는 API를 제공.

    - 다양한 개발 도구와 라이브러리를 사용가능.
      ㄴ 앱 개발에 필요한 작업을 보다 쉽게 처리할 수 있음.

 

  • JVM(Java Virtual Machine)
    - 여러가지의 기기 위에 Java 프로그램을 실행시킬 수 있는 가상의 기기를 만들어주는 것을 의미.

 

  • JRE & JDK
    - JRE(Java Runtime Environment)
      ㄴ 자바 실행 환경.
      ㄴ .class 파일만 실행 가능.

    - JDK(Java Development Kit)
      ㄴ 자바 개발 키트.
      ㄴ JRE(JVM)의 기능을 포함하고 있음.
      ㄴ .java 파일들을 .class 파일들로 변환해 주는 Java Compiler(javac)의 기능이 있음.
      ㄴ 코드를 디버깅하는 jbd가 있음.

    * 디버깅(중단점 일시정지 + 코드 라인단위 수행)
      - 개발한 코드들을 한줄씩 객체와 메소드를 수행하면서 변수들도 변화는 과정을 코드를 따라가면서 변수를 볼 수 있는 기능.
      - 작성한 코드 라인에 중단점을 설정하고 디버그모드로 프로그램을 실행하면 프로그램이
        중단점의 코드라인을 수행할 때 프로그램 흐름이 일시정지되며 변수들을 볼 수 있게 도와줌.

 

  • main 메서드에 대한 코드 해석하기.
public class Main {
	public static void main(String[] args) {
		System.out.println("Hello world!");
	}
}
  • public class Main{ }
    - class 정의.
    - public : 클래스 경로 외부에서 실행시킬 수 있다고 표시해 주는 "접근 제어자".
                    클래스 경로 외부에서 호출 못하도록 막는 접근제어자는 private, protected 등도 있음.
    - class : 객체를 만드는 클래스라고 선언.
    - Main : 클래스명. 파일명과 일치시켜야함. Java컴파일러가 바이트코드 변환했을 때의 파일 확장명(.class)와 일치됨.

  • public static void main( )
    - main 메서드 정의.
    - public : 외부에서 실행시킬 수 있다고 표시해주는 "접근제어자".
    - static : Java 컴파일러가 바이트 코드로 변환할 때 미리 정의되는 메서드 표기. 앱 실행 시 한 번만 정의되며
                   static 메서드 또는 변수(데이터)끼리만 호출할 수 있음.
    - void : 메서드의 응답값을 정의하는 곳. void는 응답할 값이 없다는 정의. int는 정수, char는 문자, string은 문자열 등.

  • (String [ ] args)
    - 메서드가 시작될 때 넘겨받을 데이터들(변수들).
    - String[ ] : 문자열 여러 개 데이터 타입.
    - args : 문자열 여러개 데이터의 이름(사용자가 정의한 값).

  • System.out.print() : 출력창에 괄호 안으로 전달된 데이터를 출력.
  • System.out.println() : 출력창에 괄호 안으로 전달된 데이터를 출력 후 줄 바꿈(sout).
System.out.print(7);
System.out.println(3);
System.out.println(3.14);
System.out.println("JAVA");

// 실행 결과
7
3
3.14
JAVA

 

  • 변수(변하는 저장공간)
    - '수'로 끝나지만 숫자만 말하는 것이 아니라 하나의 값을 저장할 수 있는 저장공간을 의미.
    - 이름(변수명)을 붙여서 필요한 값을 저장해 둠.
int number = 10; // 1. 변수로 선언 및 초기화

number = 11; // 2. 변수의 값을 바꾼다. (덮어쓰기)

 

  •  상수(변하지 않는 저장공간)
    - 저장효율을 위해 변하지 않을 값을 따로 저장하는 공간이 있기 때문.
final int number = 10; // 1. 상수로 선언 (데이터 타입 앞에 final 을 붙이면 됩니다.)

number = 11; // e2. 변수의 값을 바꾸려고하면 에러가 납니다!

 

  • 기본형 변수
    - 논리형 변수 : boolean
      ㄴ True / False 값만 저장.
boolean flag = true; // 1. 논리형 변수 boolean 으로 선언 및 True 값으로 초기화

flag = false; // 2. False 값으로도 저장할 수 있습니다.


       - 문자형 변수 : char
         ㄴ 'A', '1'과 같은 문자 '하나'만 저장. 작은따옴표(' ')를 사용.
         ㄴ 문자 뒤에 \0(널문자)가 없음.

char alphabet = 'A'; // 문자 하나를 저장합니다.


       - 정수형 변수 : byte, short, int, long
         ㄴ 정수형 숫자값을 저장.

byte byteNumber = 127; // byte 는 -128 ~ 127 범위의 숫자만 저장 가능합니다.

short shortNumber = 32767; // short 는 -32,768~32,767 범위의 숫자만 저장 가능합니다. 2byte

int intNumber = 2147483647; // int 는 -21억~21억 범위의 숫자만 저장 가능합니다. 4byte

long longNumber = 2147483647L; // long 은 숫자뒤에 L 을 붙여서 표기하며 매우 큰수를 저장 가능합니다. 9백경 범위. 8byte


       - 실수형 변수 : float, double
         ㄴ 0.123, 0.9999와 같은 소수점 실수값을 저장.

float floatNumber = 0.123f; // float 는 4byte 로 3.4 * 10^38 범위를 표현하는 실수값
//long 범위 보다 큼

double doubleNumber = 0.123123123; // double 은 8byte 로 1.7 * 10^308 범위를 표현하는 실수값
//long 범위 보다 큼

 

  • 참조형 변수
    - 문자열 변수 : String
      ㄴ "Apple", "텍스트"와 같은 문장을 저장. 큰따옴표를 사용하여 범위를 지정.
      ㄴ 문장의 끝에 \0(널문자)가 함께 저장됨(몇 개의 byte를 쓸지 모르기 때문에 끝을 표기).

    - 그 외 : Object, Array, List
      ㄴ 객체, 배열, 리스트와 같은 단일 저장공간에 담을 수 없는 값을 저장.
     
String message = "Hello World"; // 문자열을 저장합니다.

//////////////////

List<int> alphabet = [0,1,2,3]; // 기본형 변수 여러개를 저장합니다.

 

  • 래퍼 클래스 변수(Wrapper Class)
    - 기본형 변수를 클래스로 한번 랩핑(감싸는)하는 변수.
    - 클래스가 객체지향 언어인 Java의 핵심기능이기 때문에 클래스로 변수를 관리하면 객체지향의 많은 기능을 사용할 수 있음.
    - 박싱 : 기본 타입에서 래퍼 클래스 변수를 감싸는 것.
    - 언박싱 : 래퍼 클래스 변수를 기본 타입 변수로 가져오는 것.
// 박싱 VS 언박싱

// 박싱
// Integer 래퍼 클래스 num 에 21 의 값을 저장
int number = 21;
Integer num = new Integet(number);

// 언박싱
int n = num.intValue(); // 래퍼 클래스들은 inValue() 같은 언박싱 메서드들을 제공해줍니다.
기본 타입 래퍼 클래스
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

 

  • 아스키코드의 규칙으로 문자를 저장(표현)
//숫자 -> 문자

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int asciiNumber = sc.nextInt();
		char ch = (char)asciiNumber; // 문자로 형변환을 해주면 숫자에 맞는 문자로 표현됩니다.

		System.out.println(ch);
	}

}

// 입력
97

// 출력
a

////////////////////////////////
// 문자 -> 숫자

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		char letter = sc.nextLine().charAt(0); // 첫번째 글자만 받아오기위해 charAt(0) 메서드를 사용합니다.
		int asciiNumber = (int)letter; // 숫자로 형변환을 해주면 저장되어있던 아스키 숫자값으로 표현됩니다.

		System.out.println(asciiNumber);
	}

}

// 입력
a

// 출력
97

 

  • 참조형 변수 Stack & Heap 영역
    - 다른 기본형 변수가 실제 값을 저장하는 저장공간이라면 참조형 변수는 실제 값이 아닌 원본값의 주소값을 저장.
    - 참조형 변수는 즉 주소값을 저장하는 "주소형 변수"라고 부름.
    - 기본형 변수는 원본값이 Stack 영역에 있음. 참조형 변수는 원본값이 Heap 영역에 있음.
    - Stack 영역 : 정적으로 할당된 메모리 영역.
      ㄴ 크기가 몇 byte인지 정해져 있는 기본형 변수를 저장.
      ㄴ 크기가 정해져있는 참조형 변수의 주소값도 저장.

    - Heap 영역 : 동적으로 할당된 메모리 영역.
      ㄴ 크기가 계속 늘어날 수 있는 참조형 변수의 원본을 저장.

 

  • 입력
    - Java 프로그램에서는 기본적으로 Scanner.in 객체의 next() 명령을 사용해서 입력받음.
Scanner sc = new Scanner(System.in); // Scanner 객체를 new 명령어로 생성합니다.
String input = sc.next();  // sc(Scanner)의 .next(); 를 실행하면 input 변수에 입력한 글자를 받을 수 있습니다.

 

  • 출력
    - Java 프로그램에서는 기본적으로 System.out 객체의 println() 명령을 사용해서 출력.
Scanner sc = new Scanner(System.in);
String input = sc.next();  

System.out.println("입력값 : " + input);  // 입력한 글자를 출력합니다.

// 실행 결과
{입력}
입력값 : {입력}

 

  • 형변환
    - Java 프로그래밍 중 문자열로 입력받은 변수를 숫자로 변환해서 계산을 하고 싶은 경우, 문자열에 숫자값을 추가하고 싶은 경우.
    - 주로 기본형 변수인 정수, 실수, 문자 들 사이에서 일어남.
    - 정수와 실수 간에 변환할 때는 ({ 원하는 타입 }) 명령을 통해 변환할 수 있음(캐스팅).
      ㄴ Double, Float to Int : (Int)캐스팅으로 시수를 정수로 치환하는 방법. 실수형의 소수점아래는 버려짐.
double doubleNumber = 10.101010;
float floatNumber = 10.1010

int intNumber;
intNumber = (int)doubleNumber; // double -> int 형변환
intNumber = (int)floatNumber; // float -> int 형변환


       - Int to Double, Float : (Double, Float) 캐스팅으로 정수형을 실수형으로 변환하는 방법.

int intNumber = 10;

double doubleNumber = (double)intNumber; // int -> double 형변환
float floatNumber = (float)intNumber;  // int -> float 형변환

 

  • 자동 형변환
    - 형변환을 직접적으로 캐스팅하지 않아도 자동으로 형변환 되는 케이스가 있음.
    - 프로그램 실행 도중에 값을 저장하거나 계산할 때 자동으로 타입변환이 일어남.
    - 변수 타입별 크기 순서
      ㄴ byte(1) -> short(2) -> int(4) -> long(8) -> float(4) -> double(8)
//작은 크기의 타입에서 큰 크기의 타입으로 저장될 때.
byte byteNumber = 10;
int intNumber = byteNumber;    // byte -> int 형변환
System.out.println(intNumber); // 10

char charAlphabet = 'A';
intNumber = charAlphabet;   // char -> int 형변환
System.out.println(intNumber); // A의 유니코드 : 65

intNumber = 100;
long longNumber = intNumber; // int -> number 형변환
System.out.println(longNumber); // 100

intNumber = 200;
double doubleNumber = intNumber; // int -> double 형변환
System.out.println(doubleNumber); // 200.0  (소수점이 추가된 실수출력)

///////////////////////////////////////

//작은 크기의 타입이 큰 크기의 타입과 계산될 때.
int intNumber = 10;
double doubleNumber = 5.5;
double result = intNumber + doubleNumber; // result 에 15.5 저장됨 (int -> double)

intNumber = 10;
int iResult = intNumber / 4; // iResult 에 2 저장됨 (int형 연산 -> 소수점 버려짐)

intNumber = 10;
double dResult = intNumber / 4.0; // dResult 에 2.5 저장됨 (double형 연산 -> 소수점 저장)

 

  • 연산자의 종류
산술 연산자  +    -    *    /    %    <<    >>  사칙 연산과 비트연산
비교 연산자  >    <    >=    <=    ==    !=  크고 작읍과 같고 다름을 비교
논리 연산자  &&    | |    !  AND와 OR으로 조건을 연결
대입 연산자  =    ++    --  우변의 값을 좌변에 저장, 연산 복합 대입
기타 연산자  (type)    ? :    instance of  형변환 연산자, 삼항 연산자,
instance of 연산자

 

  • 산술 연산자
    - 사칙 연산 및 비트연산을 포함.
    - 사칙 연산을 계산한 결괏값을 응답.
// 사칙 연산
System.out.println(4 + 2); // 6
System.out.println(4 - 2); // 2
System.out.println(4 * 2); // 8
System.out.println(4 / 2); // 2
System.out.println(5 / 2); // 2
System.out.println(2 / 4); // 0
System.out.println(4 % 2); // 0
System.out.println(5 % 2); // 1

// 우선 순위 연산
System.out.println(2 + 2 * 2); // 6
System.out.println((2 + 2) * 2); // 8
System.out.println(2 + (2 * 2)); // 6

// 변수를 이용한 연산
int a = 20;
int b = 10;
int c;

// 덧셈
c = a + b;
System.out.println(c); // 30

// 뺄셈
c = a - b;
System.out.println(c); // 10

// 곱셈
c = a * b;
System.out.println(c); // 200

// 나눗셈 (몫)
c = a / b;
System.out.println(c); // 2

// 나눗셈 (나머지) = 나머지 연산
c = a % b;
System.out.println(c); // 0

 

  • 비교 연산자
    - 값의 크고/작음을 비교하거나 같고/다름을 비교하여 참(true)/거짓(false) 값인 boolean 값을 출력.
// 비교 연산자 (참이면 true, 거짓이면 false)
System.out.println(10 > 9); // 10 는 9 보다 크다 (참이면 true, 거짓이면 false)
System.out.println(10 >= 9); // 10 는 9 보다 크거나 같다 (true)
System.out.println(10 < 9); // 10 는 9 보다 작다 (false)
System.out.println(10 <= 9); // 10 는 9 보다 작거나 같다 (false)
System.out.println(10 == 10); // 10 는 10 와 같다 (true)
System.out.println(10 == 9); // 10 는 9 과 같다 (false)
System.out.println(10 != 10); // 10 는 10 와 같지 않다 (false)
System.out.println(10 != 9); // 10 는 9 과 같지 않다 (true)

 

  • 논리 연산자
    - 비교 연산의 결괏값으로 받을 수 있는 boolean 값을 연결하는 연산자.
    - 조건을 연결하였을 때의 boolean 값들을 조합하여 참(true)/거짓(false) 값인 boolean 값을 출력.
// 논리 연산자
boolean flag1 = true;
boolean flag2 = true;
boolean flag3 = false;

System.out.println(flag1); // true
System.out.println(flag2); // true
System.out.println(flag3); // false

// 피연산자 중 하나라도 true 이면 true
System.out.println(flag1 || flag2); // true
System.out.println(flag1 || flag2 || flag3); // true
// 피연산자 모두 true 이면 true
System.out.println(flag1 && flag2); // true (flag1, flag2 모두 true 라서)
System.out.println(flag1 && flag2 && flag3); // false (flag3은 false 라서)

// And 연산
System.out.println((5 > 3) && (3 > 1)); // 5 는 3 보다 크고, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) && (3 < 1)); // 5 는 3 보다 크고, 3 은 1 보다 작다 (false)

// Or 연산
System.out.println((5 > 3) || (3 > 1)); // 5 는 3 보다 크거나, 3 은 1 보다 크다 (true)
System.out.println((5 > 3) || (3 < 1)); // 5 는 3 보다 크거나, 3 은 1 보다 작다 (true)
System.out.println((5 < 3) || (3 < 1)); // 5 는 3 보다 작거나, 3 은 1 보다 작다 (false)

// System.out.println(1 < 3 < 5); // 불가능한 코드

// 논리 부정 연산자
System.out.println(!flag1); // false (flag1 값의 반대)
System.out.println(!flag3); // true (flag3 값의 반대)
System.out.println(!(5 == 5)); // false
System.out.println(!(5 == 3)); // true

 

  • 대입 연산자
    - 변수를 바로 연산해서 그 자리에서 저장하는 연산자.
    - 기본 대입 연산자인 = 와 다른 연산을 함께 쓰는 복합 대입 연산자가 있음(+=, -= 등).
    - 복합 대입 연산자기본 대입 연산자를 심플하게 작성하게 해 주는 것이지 기능은 같음.
    +=  1 은  ++  과 동일(피연산자에 1 더해주기).
    -=  1 은  --  와 동일(피연산자에 1 빼주기).
// 대입 연산자
int number = 10;
number = number + 2;
System.out.println(number); // 12

number = number - 2;
System.out.println(number); // 10

number = number * 2;
System.out.println(number); // 20

number = number / 2;
System.out.println(number); // 10

number = number % 2;
System.out.println(number); // 0

number = number++;
System.out.println(number); // 2

number = number--;
System.out.println(number); // 0

// 복합 대입 연산자
number = 10;

number += 2;
System.out.println(number); // 12

number -= 2;
System.out.println(number); // 10

number *= 2;
System.out.println(number); // 20

number /= 2;
System.out.println(number); // 10

number %= 2;
System.out.println(number); // 0

 

  • 형변환 연산자
// 형변환 연산자
int intNumber = 93 + (int) 98.8; // 93 + 98

double doubleNumber = (double) 93 + 98.8; // 93.0 + 98.8

 

  • 삼항 연산자
    - 비교 연산의 결괏값에 따라 응답할 값을 직접 지정할 수 있는 연산자.
    - 삼항 연산자는 3가지 피연산자가 존재하여 삼항 연산자라고 함(조건 / 참 결과 / 거짓 결과)
    ( 조건 )   ?   ( 참 결과 )    (거짓 결과) 
// 삼항 연산자
int x = 1;
int y = 9;

boolean b = (x == y) ? true : false;
System.out.println(b); // false

String s = (x != y) ? "정답" : "땡";
System.out.println(s); // 땡

int max = (x > y) ? x : y;
System.out.println(max); // 9

int min = (x < y) ? x : y;
System.out.println(min); // 1

 

  • 연산자 우선순위
    - 산술 > 비교 > 논리 > 대입
// 연산자 우선순위
int x = 2;
int y = 9;
int z = 10;

boolean result = x < y && y < z; // <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // true

result = x + 10 < y && y < z; // +10 산술연산자 계산 후 <,> 비교연산자 계산 후 && 논리 연산자 계산
System.out.println(result); // false

result = x + 2 * 3 > y; // 산술연산자 곱센 > 덧셈 순으로 계산 후 > 비교연산자 계산
System.out.println(result); // false (8>9)

result = (x + 2) * 3 > y; // 괄호안 덧셈 연산 후 괄호 밖 곱셈 계산 후 > 비교연산자 계산
System.out.println(result); // true (12>9)

 

  • 산술변환
    - 연산 전에 피연산자의 타입을 일치시키는 것(둘 중에 저장공간 크기가 더 큰 타입으로 일치).
    - 피연산자의 타입이 int 보다 작은 short 타입이면 int로 변환.
    - 피연산자의 타입이 long 보다 작은 int, short 타입이면 Long으로 변환.
    - 피연산자의 타입이 float 보다 작은 long, int, short 타입이면 float으로 변환.
    - 피연산자의 타입이 double 보다 작은 float, long, int, short 타입이면 double로 변환.
// 산술변환 
public class Main {

	public static void main(String[] args) {

		short x = 10;
		int y = 20;

		int z = x + y; // 결과값은 더 큰 표현타입인 int 타입의 변수로만 저장할 수 있습니다.

		long lx = 30L;
		long lz = z + lx; // 결과값은 더 큰 표현타입인 long 타입의 변수로만 저장할 수 있습니다.

		float fx = x; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
		float fy = y; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
		float fz = z; // 결과값은 더 큰 표현타입인 float 타입의 변수로만 저장할 수 있습니다.
		System.out.println(lz);
		System.out.println(fx);
		System.out.println(fy);
		System.out.println(fz);
	}

}

 

  • 비트 연산
    - bit의 자릿수를 옮기는 것.
    << (왼쪽으로 자리수 옮기기),  >> (오른쪽으로 자리수 옮기기).
// 비트 연산

// 참고, 3의 이진수값은 11(2) 입니다. 12의 이진수값은 1100(2) 입니다.
// (2) 표기는 이 숫자가 이진수값이라는 표식 입니다.

System.out.println(3 << 2); 
// 3의 이진수값인 11(2) 에서 왼쪽으로 2번 옮겨져서 1100(2) 인 12값이 됩니다.


System.out.println(3 >> 1); 
// 3의 이진수값인 11(2) 에서 오른쪽으로 1번 옮겨져서 1(2) 인 1 값이 됩니다.

 

  • 조건문 - if
    if( 조건 )   { 연산 }  의 형태로 사용.
// 조건문
boolean flag = true;

if (flag) {
	System.out.println("flag 값은 true 입니다."); // flag 값은 true 입니다. 출력
}
// 조건문 with else
boolean flag = false;

if (flag) {
	System.out.println("flag 값은 true 입니다."); // 미출력
} else {
	System.out.println("flag 값은 false 입니다."); // flag 값은 false 입니다. 출력
}
// 조건문 with else if
int number = 2;

if (number == 1) {
	System.out.println("number 값은 1 입니다."); // 미출력
} else if (number == 2) {
	System.out.println("number 값은 2 입니다."); // number 값은 2 입니다. 출력
} else {
	System.out.println("number 값은 모르는 값입니다."); // 미출력
}
// 중첩 조건문
boolean flag = true;
int number = 2;

if (flag) {
	if (number == 1) {
		 System.out.println("flag 값은 true, number 값은 1 입니다."); // 미출력
  } else if (number == 2) {
		 System.out.println("flag 값은 true, number 값은 2 입니다."); // flag 값은 true, number 값은 2 입니다. 출력
	}
} else {
	if (number == 1) {
		 System.out.println("flag 값은 false, number 값은 1 입니다."); // 미출력
  } else if (number == 2) {
		 System.out.println("flag 값은 false, number 값은 2 입니다."); // 미출력
	}
}

 

  • 중첩 if문을 활용한 가위바위보
// 조건문으로 가위바위보 만들기

import java.util.Objects;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.print("A 입력 : ");
		String aHand = sc.nextLine(); // A 입력

		System.out.print("B 입력 : ");
		String bHand = sc.nextLine(); // B 입력

		if (Objects.equals(aHand, "가위")) { // 값을 비교하는 Obects.equals() 메서드 사용
			if (Objects.equals(bHand, "가위")) {
				System.out.println("A 와 B 는 비겼습니다."); // A 와 B 의 입력값을 비교해서 결과 출력
			} else if (Objects.equals(bHand, "바위")) {
				System.out.println("B 가 이겼습니다.");
			} else if (Objects.equals(bHand, "보")) {
				System.out.println("A 가 이겼습니다.");
			} else {
				System.out.println(" B 유저 값을 잘못 입력하셨습니다.");
			}
		} else if (Objects.equals(aHand, "바위")) {
			if (Objects.equals(bHand, "가위")) {
				System.out.println("A 가 이겼습니다.");
			} else if (Objects.equals(bHand, "바위")) {
				System.out.println("A 와 B 는 비겼습니다.");
			} else if (Objects.equals(bHand, "보")) {
				System.out.println("B 가 이겼습니다.");
			}
		} else if (Objects.equals(aHand, "보")) {
			if (Objects.equals(bHand, "가위")) {
				System.out.println("B 가 이겼습니다.");
			} else if (Objects.equals(bHand, "바위")) {
				System.out.println("A 가 이겼습니다.");
			} else if (Objects.equals(bHand, "보")) {
				System.out.println("A 와 B 는 비겼습니다.");
			}
		}

	}
}

// 입/출력 예시
// A 입력 : 가위
// B 입력 : 보
// A 가 이겼습니다.

 

  • 조건문 - switch 문
    - switch(피연산자) / case(조건)
    - if문 보다 좀 더 가독성이 좋은 조건문 표현식.
    switch(피연산자)   { case(조건) : (연산) }  형태로 많이 쓰임.
    - switch 피연산자가 case 조건을 만족하면 case: 뒤에 명시되어 있는 연산을 수행.
    - case(조건) : (연산) 은 여러 개를 설정할 수 있음.
    - 각 case의 연산문 마지막에는 break; 를 꼭 넣어줘야 함.
    - switch문 중괄호 안의 제일 마지막에  default: (연산)  을 명시하여 case 조건들이 모두 만족하지 않을 때 수행할 연산을 정해줌.
    - default: (연산) 은 아무것도 만족하지 않을 때 수행하는 것이라서 없다면 생략 가능.
// switch/case 문 

int month = 8;
String monthString = "";
switch (month) {
    case 1:  monthString = "1월";
             break;
    case 2:  monthString = "2월";
             break;
    case 3:  monthString = "3월";
             break;
    case 4:  monthString = "4월";
             break;
    case 5:  monthString = "5월";
             break;
    case 6:  monthString = "6월";
             break;
    case 7:  monthString = "7월";
             break;
    case 8:  monthString = "8월"; 
             break;
    case 9:  monthString = "9월";
             break;
    case 10: monthString = "10월";
             break;
    case 11: monthString = "11월";
             break;
    case 12: monthString = "12월";
             break;
    default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력

 

  • if문과 switch문의 차이점
    1. 복합조건
      - if문은 복합조건을 지원 / switch문은 피연산자 한 개에 대한 조건만 지원.

    2. 코드중복
    - if문은 상대적으로 코드중복이 많음 / switch문은 코드중복이 적음.
// if vs switch
// switch 문 실습코드를 if 문으로 바꿔보겠습니다.

// switch 
int month = 8;
String monthString = "";
switch (month) {
    case 1:  monthString = "1월";
             break;
    case 2:  monthString = "2월";
             break;
    case 3:  monthString = "3월";
             break;
    case 4:  monthString = "4월";
             break;
    case 5:  monthString = "5월";
             break;
    case 6:  monthString = "6월";
             break;
    case 7:  monthString = "7월";
             break;
    case 8:  monthString = "8월"; 
             break;
    case 9:  monthString = "9월";
             break;
    case 10: monthString = "10월";
             break;
    case 11: monthString = "11월";
             break;
    case 12: monthString = "12월";
             break;
    default: monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력

// if 로 변환
if (month == 1) {
	monthString = "1월";
} else if (month == 2) {
	monthString = "2월";
} else if (month == 3) {
	monthString = "3월";
} else if (month == 4) {
	monthString = "4월";
} else if (month == 5) {
	monthString = "5월";
} else if (month == 6) {
	monthString = "6월";
} else if (month == 7) {
	monthString = "7월";
} else if (month == 8) {
	monthString = "8월";
} else if (month == 9) {
	monthString = "9월";
} else if (month == 10) {
	monthString = "10월";
} else if (month == 11) {
	monthString = "11월";
} else if (month == 12) {
	monthString = "12월";
} else {
	monthString = "알수 없음";
}
System.out.println(monthString); // 8월 출력

 

  • 반복문 - for
    for  ( 초기값;   조건문;   증가연산 { (연산) }  형태로 사용.
    - 특정 조건은 초기값과 조건문을 통해 정의.
    - 반복할 때마다 값을 증가시키려면 증가연산을 정의.
    - 초기값이 조건문을 만족할 때까지 (연산)을 수행하면서 회차마다 증가연산을 수행.
// for 문

for(int i=0; i < 4; i++) { // 변수 i 값은 0 ~ 3 까지 반복
    System.out.println(i + "번째 출력"); // i 변수와 문자열 합치기
}

// 출력
0번째 출력
1번째 출력
2번째 출력
3번째 출력

 

  • 향상된 for문
    - for 소괄호 안에 값이 3개나 들어가기 때문에 이걸 2개로 줄여주는 방법.
    - 연속된 변수목록을 출력할 때 쓰임.
    for  (변수 타입   변수 명  목록변수 { (연산) }  형태로 사용.
    - 변수 타입과 변수 명은 for 문 안에서 연산을 수행할 변수를 정의.
    - 목록변수는 값 여러 개를 하나의 변수로 저장하고 싶을 때 사용.
// 향상된 for 문

int[] numbers = {3,6,9,12,15};
for(int number: numbers) {
    System.out.print(number + " "); 
}

// 출력
3 6 9 12 15

////////////////////////

// 만약 기존 for 문으로 구현한다면?

int[] numbers = {3,6,9,12,15};
for(int i = 0; i < numbers.length; i++) { // 배열에 .length 를 붙이면 길이값이 응답됩니다.
    System.out.println(numbers[i]);
}

// 출력
3 6 9 12 15

 

  • 반복문 - while문, do-while문
    - for문과 동일하게 특정 조건에 따라 연산을 반복해서 수행하고 싶을 때 사용하는 문맥.
    - 다만 초기값 없이 조건문만 명시하여 반복.
    while(조건문)   { (연산) }  형태로 사용(while문).
      ㄴ 위처럼 while문으로 사용하면 조건문을 만족해야지만 연산이 반복수행함.
      ㄴ 한번 반복할 때마다 조건문을 체크해서 조건문이 false이면 반복을 중단.
    do { (연산) }   while(조건문)  형태로 사용(do-while문).
      ㄴ 위처럼 do-while 문으로 사용하면 최초 1회 연산수행 후 조건문을 체크하여 더 반복할지 결정.
      ㄴ 반복하게 된다면 그 이후에는 한번 반복할 때마다 조건문을 체크해서 조건문이 false이면 반복을 중단.
// while 문

int number = 0;
while(number < 3) {
		number++;
    System.out.println(number + "출력"); 
}

// 출력
1출력
2출력
3출력

//////////////////////

// do-while 문

int number = 4;
do {
    System.out.println(number + "출력"); 
} while(number < 3); // 연산을 한번 수행 후 조건문 체크

// 출력
4출력

 

  • break 명령
    - break; 명령을 호출하면 가장 가까운 블록의 for문 또는 while문, switch문을 중단.
// break 명령 범위

for (int i = 0; i < 10; i++) {
	System.out.println("i: " + i);
	if (i == 2) {
		break; // i 가 2일때 가장 바깥 반복문이 종료됩니다.
	}
	for (int j = 0; j < 10; j++) {
		System.out.println("j: " + j);
		if (j == 2) {
			break; // j 가 2일때 가장 안쪽 반복문이 종료됩니다.
		}
	}
}

// 출력
i: 0 // 바깥 반복문 부터 수행 시작
j: 0 // 안쪽 반복문 1회차 수행
j: 1
j: 2 // j 가 2일때 안쪽 반복문 break;
i: 1 // 바깥 반복문은 아직 break; 호출이 안됬으므로 다음 반복수행
j: 0 // 안쪽 반복문 2회차 수행
j: 1
j: 2 // j 가 2일때 안쪽 반복문 두번째 break;
i: 2 // i 가 2일때 바깥 반복문도 break; 호출되어 종료

 

  • continue 명령
    - for문 또는 while문에서 해당 순서를 패스하고 싶을 때 continue 명령을 사용.
// continue 명령

int number = 0;
while(number < 3) {
		number++;
		if (number == 2) {
			continue;  // 2일때 반복 패스
		}
    System.out.println(number + "출력"); 
}

// 출력
1출력
3출력

 

  • 조건문과 반복문을 활용한 구구단
// 구구단 생성기

for (int i = 2; i <= 9; i++) { // 구구단 첫번째 지수 i
	for (int j = 2; j <= 9; j++) { // 구구단 두번째 지수 j
		System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
	}
}

// 출력
2곱하기2는4입니다.
2곱하기3는6입니다.
2곱하기4는8입니다.
... 중략 ...
9곱하기8는72입니다.
9곱하기9는81입니다.

/////////////////////////////

// 선택적 구구단 생성기

Scanner sc = new Scanner(System.in);
int passNum = sc.nextInt(); // 출력제외할 구구단수 값
for (int i = 2; i <= 9; i++) {
	if (i == passNum) {
		continue;
	}
	for (int j = 2; j <= 9; j++) {
		System.out.println(i + "곱하기" + j + "는" + (i * j) + "입니다.");
	}
}

// 입력
2

// 출력 - 입력값인 2단은 건너띄고 구구단 출력
3곱하기2는6입니다.
3곱하기3는9입니다.
3곱하기4는12입니다.
... 중략 ...
9곱하기8는72입니다.
9곱하기9는81입니다.

 

 

 

 

  • 유지할 점
    - 파이썬과 다른 자바만의 문법들을 더 익히기.
    - 인텔리제이의 사용법을 더 익숙하게 만들기.

'개발공부 > Java/Spring' 카테고리의 다른 글

객체지향 & JVM  (1) 2023.04.09
내가 정리한 Java의 기초(2)  (0) 2023.04.07
토이프로젝트 UBS  (0) 2023.03.30
토이프로젝트 1일차  (0) 2023.03.27
웹개발 종합 6일차(서버관련)  (0) 2023.03.25

댓글