Day 8

강태훈·2026년 1월 8일

nbcamp TIL

목록 보기
8/14

1. 자바 기초 문법

1-5 입출력

  • 출력
    System.out.println("안녕하세요!");

  • \n: 줄바꿈

  • 입력
    Scanner scanner = new Scanner(System.in);

    import java.util.Scanner; // Scanner를 사용하려면 import 필요
    public class ScannerPractice {
        public static void main(String[] args) {
            // Scanner 객체 생성 & 변수에 담기
            Scanner scanner = new Scanner(System.in);        
        }
    }
  • 문자열 입력받기

    import java.util.Scanner;
    public class ScannerPractice {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("좋아하는 문장을 입력하세요: ");
            String sentence = scanner.nextLine();  // 데이터 전달
            System.out.println("좋아하는 문장: " + sentence);
        }
    }
  • 숫자 입력받기

    import java.util.Scanner;
    public class ScannerPractice {
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("정수를 입력하세요: ");
            int num1 = scanner.nextInt();
            System.out.print("실수를 입력하세요: ");
            double num2 = scanner.nextDouble();
            System.out.print("큰 정수를 입력하세요: ");
            long num3 = scanner.nextLong();
            System.out.println("입력한 정수: " + num1);
            System.out.println("입력한 실수: " + num2);
            System.out.println("입력한 큰 정수: " + num3);
        }
    }

1-6 연산자(+,-,*,/,%,=)

  • 기본 사칙연산
  • 정수끼리 나누면 소수점 버려짐. 소수점이 필요하면 소수점과 연산
  • 모듈러 연산자(%): 나머지를 구함.

(1) 복합 대입 연산자(+=,-=,*=,/=,%=)

  • num += 3이면 num = num + 3이라는 의미

(2) 증감 연산자(++,--)

  • 변수 앞에 달면 전위 연산(++i,연산 후에 출력)
  • 변수 뒤에 달며 후위 연산(i++,출력 후에 연산)

(3) 비교 연산자(=)

  • ==: 같으면 true, 다르면 false
  • !=: 같으면 false, 다르면 true
  • 크기비교연산자(>,<,>=,<=): 맞으면 true, 틀리면 false

(4) 논리연산자(&&,||,!)

  • AND(&&): 두 조건이 모두 참일때 true
  • OR(||): 둘 중에 하나라도 참일때 true
  • NOT(!): true는 false로, false는 true로 변환

(5) 연산자 우선 순위

  • 산술 -> 비교 -> 논리 -> 대입
  • 산술 연산에서는 사칙연산과 마찬가지
  • 논리 연산자 우선 순위: NOT -> AND -> OR

(6) 예시

System.out.println(10 / 2 + 3 * 2 > 10 || false);
// 실행 순서: ((10 / 2) + (3 * 2)) > 10 || false
// → (5 + 6) > 10 || false
// → 11 > 10 || false
// → true || false
// → true
System.out.println(5 + 3 > 2 * 4 && 10 % 3 == 1);
// 실행 순서: (5 + 3) > (2 * 4) && (10 % 3) == 1
// → 8 > 8 && 1 == 1
// → false && true
// → false

문자열 비교는 항상 .equals() 를 활용(동등성/동일성 문제)

String text1 = "Hello";
String text2 = "Hello";
boolean isEqual = text1.equals(text2);
System.out.println("text1과 text2가 같은가? " + isEqual);
//출력결과:
text1과 text2가 같은가? true

1-7 조건문

  • if: 조건 수식이 참일때 실행

    	if (조건수식) {
    		명령문;
        }
  • if-else: 조건 수식이 거짓일때 실행

    	if (조건수식) {
    		명령문;
        }
    	else {
    		명령문;
        }
  • else-if: 여러개의 조건 수식을 제어할때 사용
    	if (조건수식) {
    		명령문;
        }
    	else if (조건수식) 	{
    		명령문;
        }
    	else {
    		명령문;
    	}
  • switch: 특정 값에 따라 여러 동작을 실행
    	switch (단일값) 
    	{
    	    case 값1:
    	        // 값1일 때 실행할 코드
    	        break;
    	    case 값2:
    	        // 값2일 때 실행할 코드
    	        break;
    	    default:
    	        // 위의 값들과 일치하지 않을 때 실행할 코드
    	}

1-8 반복문

  • for

    • 종결 조건이 true일 경우 반복, false일 경우 종료

      for (시작조건; 종결조건; 조건변화수식) {
      		...
      }
    • break: 반복을 벗어나기 위해 함께 사용

      public class Robot {
          public static void main(String[] args) {
      		    int customers = 5;
      		    for (int i = 1; i <= customers; i++) {
      				    if (i == 4) {
      						    break; // 4번째 손님이 들어올 경우 반복을 벗어납니다.
      				    }
      				   System.out.println(i + "번째 손님, 안녕하세요!");
      			}
      			  System.out.println("반복문이 종료되었습니다.");
          }
      }
    • continue: 특정 회차의 반복을 건너뛸 때 사용

      public class Robot {
          public static void main(String[] args) {
      		    int customers = 5;
      		    for (int i = 1; i <= customers; i++) {
      				    if (i == 2) {
      						    continue; // 2번 손님은 건너 뜁니다.
      				    }
      				   System.out.println(i + "번째 손님, 안녕하세요!");
      			  }
      			  System.out.println("반복문이 종료되었습니다.");
          }
      }
  • while

    • 종결조건식이 true일때 반복
      while (종결조건) {
      		반복할 명령문;
      }

1-9 배열

String[] adventurerList = {"gygim", "Steve", "Grace", ...};
int[] arr = new int[5]; 
//// 선언과 동시에 길이를 설정합니다. 
////자료형[] 변수이름 = new 자료형[배열의길이];
int arrLength = arr.length; ////배열이름.length
System.out.println("arrLength = " + arrLength); // arrLength = 5

문자열 배열

// 길이가 5인 문자열 배열 arrA 를 선언 
String[] arrA = new String[5];

논리형 배열

// 길이가 3인 논리형 배열 arrB 를 선언
boolean[] arrB = new boolean[3];

배열의 요소: 배열 안에 들어있는 각각의 값

  • int[] arr = {10, 20, 30, 40, 50};
  • 배열 선언과 동시에 배열의요소 설정

인덱스(index) - 배열의 요소에 접근하는 방법

  • index의 시작은 0

향상된 for문

  • 배열의 모든 요소를 하나씩 꺼내서 활용할 때 편리한 반복문

  • index 직접 활용하지 못함

  • for (int a : arr) → 배열 arr에서 하나씩 꺼내서 a에 저장

  • IndexOutOfBoundsException 에러가 발생하지 않음

    for(배열의요소 : 배열) {
    		명령문;
    }
  • 예시

    int[] arr = {100, 200, 300, 400, 500};
    for (int a : arr) {
    		System.out.println("배열의 각 요소 = " + a);
    }

2차원 배열

  • 첫 번째 인덱스는 행 = 가로 방향
  • 두 번째 인덱스는 열 = 세로 방향

    boolean[][] board = new boolean[2][2];
    2x2 2차원 배열 선언

    boolean[][] board = {
    		{true, false}, // 0행의 0열, 0행의 1열,
    		{false, true}  // 1행의 0열, 1행의 1열
    };

메서드

  • 함수, 기능
  • 여러 개의 작은 명령문을 한 곳에 모아 사용하는 단위
    public class 클래스이름 {
    		[반환자료형] [메서드이름](매개변수..) {
    				작업 명령문들...
    		}
    }

예시

  • 선언부: 메서드가 정의되어 있는 곳

    public class Calculator {
    		int sum(int value1, value2) {
    				int result = value1 + value2;
    				return result;
    		}
    }
  • 호출부: 메서드를 사용하는 곳

    public class Main {
    		public static void main(String[] args {
    				Calculator calculator = new Calculator(); // Calculator 객체 소환
    				int result = calculator.sum(1, 2); // 호출부
    				System.out.println("결과: " + result);
    		}
    }

void: 반환값이 없는 메서드

  • 메서드가 데이터를 꼭 반환해야하는 건 아님
  • 반환 데이터가 없을때는 반환 자료형 위치에 void를 선언
  • void는 비어있다는 의미

return: 변환값이 있는 메서드

  • return 키워드를 활용해 반환되는 데이터를 표현할 수 있다.
  • 반환된 데이터는 호출부에서 받아서 활용할 수 있다.

2. 객체지향 이해하기

2-1 클래스와 객체

(1) 클래스(class) - 객체의 설계도

  • 첫글자가 대문자

    클래스의 구조

    • 속성(property, field) - 객체의 속성, 변수로 표현. 사람을 예로 들면 나이나 이름, 주소 등이 해당
    • 생성자(constructor) - 객체 만들때 사용, 어떻게 만들지 정의해 놓는 것(조립설명서), 없으면 객체화 불가능
    • 기능(method) - 기능
      • 게터(getter): 클래스의 속성을 가져올때 사용되는 기능
      • 세터(setter): 객체의 속성을 외부에서 설정할 수 있게 해주는 기능

(2) 객체(object) - 클래스를 통해 만들어진 실제 존재

  • 어떤 개념이나 논리 같은 것들도 객체가 될 수 있음
  • this: 객체 자신을 가리키는 키워드. 현재 실행중인 객체

(3) 인스턴스화(instantiate) - 객체를 만드는 과정

  • 객체를 만들때 new라는 키워드를 사용

2-2 Java 메모리(JVM) 구조

- Method Area(도서관 비유)

  • 프로그램 시작 시 정보가 저장
  • 클래스 정보(.class 파일) 가 올라가는 곳
  • 클래스의 메서드 정보, static 변수 등이 저장
  • 모든 객체가 공유하는 공용 공간
  • 프로그램 시작 시 정보가 저장
  • 클래스 정보(.class 파일) 가 올라가는 곳
  • 클래스의 메서드 정보, static 변수 등이 저장
  • 모든 객체가 공유하는 공용 공간

- Stack Area(접시 쌓기 비유)

  • 가장 위에 있는 접시를 먼저 꺼내듯 비슷한 구조
  • 선입후출(LIFO) 구조. 먼저 들어온 것이 가장 늦게 나간다는 뜻
  • 메서드가 호출될 때마다 새로운 접시한장(스택프레임)이 쌓임
  • 가장 위의 접시(최근 호출된 메서드)가 먼저 실행
  • 메서드 실행이 끝나면 스택에서 제거

- Heap Area(풍선 비유)

  • new 키워드로 생성된 객체가 저장되는 곳
  • 객체의 실제 데이터가 저장되고 데이터의 주소는 stack 영역에 저장

2-3 래퍼클래스(Wrapper Class)

  • 기본 자료형을 객체로 감싸는 클래스

기본형 변수: 실제 값을 저장하는 변수

참조형(Reference Type) 변수: 객체의 메모리 주소를 저장하는 변수

  • 저장된 메모리 주소=Heap 메모리 주소->객체 데이터는 Heap 영역에 저장되어 있기 때문
  • 래퍼 클래스가 담겨있는 변수도 참조형 변수
    • 하지만 출력시 메모리 주소값이 나오지않음.
    • 내부적으로 toString()이 오버라이딩되어 있기 때문

래퍼 클래스를 사용하는 이유

  • 기본형은 객체처럼 속성, 기능을 가질 수 없습니다.
  • 하지만 객체는 기능을 제공할 수 있습니다.
  • 기본형을 감싼 객체를 만들어 기능을 제공하면 편리하게 데이터처리를 할 수 있습니다.

오토박싱 vs 언박싱

  • 래퍼클래스 ↔ 기본형으로 형변환은 굉장히 자주 일어납니다.

  • Java에서는 이 형변환 과정을 자동으로 지원해 줍니다.

  • 오토박싱(Auto-boxing)

    • 기본형 → 래퍼형으로 변환하는 과정을 오토박싱
    • Integer는 참조형(객체)이지만 기본형 int 값을 직접 대입할 수 있습니다.
    • 내부적으로 컴파일러가 자동으로 Integer.valueOf(10)을 호출하여 객체를 생성하기 때문입니다.
  • 오토언박싱(Auto-unboxing)
    • 래퍼형 → 기본형으로 변환하는 과정으로 오토언박싱
    • num은 Integer 객체(참조형변수)지만 기본형 int 변수에 대입할 수 있습니다.
    • 내부적으로 컴파일러가 자동으로 num.intValue()를 호출하여 기본형으로 변환하기 때문입니다

- 기본형 연산과 래퍼형 연산의 성능 차이

  • 래퍼형은 내부적으로 데이터를 감싸고 있기때문에 연산시 불리합니다.
  • 객체에서 기본형 값을 꺼내서 연산하는 추가작업이 발생하기 때문입니다.
  • 이런 추가 작업때문에 기본형보다 래퍼클래스는 연산 속도가 느립니다.
  • 빠른 작업이 필요한 경우 기본형을 직접 활용하는 것이 좋은 선택입니다.

2-4 static

0개의 댓글