20260330MON (DAY 3)

sungsimdangmascot·2026년 3월 30일

1. do-while문: "선 실행, 후 조건 확인"

일반적인 while문은 시작 전 조건을 검사하지만, do-while문은 조건과 상관없이 무조건 한 번은 실행한다.

  • 특징: 조건식이 거짓(false)이더라도 최소 1회 실행을 보장한다.
  • 구조:
    do {
        // 실행할 코드 (최소 1번은 무조건 실행)
    } while (조건식); // ← 주의: 마지막에 세미콜론(;)이 반드시 필요하다.
    

2. break: "반복문 즉시 종료"

break는 반복문이 진행 중일 때, 특정 조건에서 루프를 아예 부수고 탈출할 때 사용한다.

  • 특징: break를 만나는 순간, 뒤에 남은 반복 횟수와 상관없이 해당 반복문을 완전히 빠져나간다.
  • 주요 용도: 무한 루프를 멈추거나, 원하는 값을 찾았을 때 더 이상의 연산을 막기 위해 사용한다.
  • 예시:
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break; // 5가 되는 순간 반복문 종료
        }
        System.out.println(i); // 1, 2, 3, 4 까지만 출력된다.
    }

3. continue: "이번 차례만 건너뛰기"

continue는 반복문을 끝내지 않는다. 다만, 이번 회차의 남은 코드만 스킵하고 다음 반복으로 바로 넘어간다.

  • 특징: continue 아래에 있는 코드는 무시하고, 즉시 반복문의 증감식이나 조건식으로 이동한다.
  • 주요 용도: 특정 조건에 해당하는 데이터를 제외하고 처리하고 싶을 때 사용한다.
  • 예시:
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            continue; // 3일 때만 아래 출력문을 건너뛴다.
        }
        System.out.println(i); // 1, 2, 4, 5가 출력된다. (3은 제외)
    }

| do-while | 선 실행 후 조건 확인 | 최소 1회 실행 보장 | 일단 한 입 먹어보기 |
| break | 반복문 완전 파괴 | 루프 탈출 (완전 종료) | 비상구로 탈출하기 |
| continue | 현재 차례만 패스 | 다음 반복으로 점프 | 유튜브 광고 건너뛰기 |


1. 변수의 한계와 객체의 등장

프로그래밍의 가장 기초인 변수는 오직 하나의 값만 저장할 수 있다는 치명적인 한계가 있다. 예를 들어 한 사람의 이름, 나이, 키를 저장하려면 변수 3개가 필요하다. 관리해야 할 데이터가 수백 개로 늘어난다면 변수만으로는 감당하기 어려워진다.

이때 등장하는 개념이 객체다. 객체는 여러 데이터를 하나로 묶어주는 커피 캐리어와 같다. 용도에 따라 다양한 데이터를 담을 수 있는 바구니를 만들어 효율적으로 관리하는 것이 객체의 핵심이다.


2. 배열(Array): 정해진 인원만 타는 버스

가장 단순한 형태의 객체는 배열이다. 배열은 같은 종류의 데이터를 나란히 줄 세워 저장한다.

배열의 특징

  • 고정된 크기: new int[3]과 같이 선언하면 3명만 탈 수 있는 버스가 생성된다. 이 크기를 초과해서 데이터를 넣으려고 하면 ArrayIndexOutOfBoundsException 에러가 발생한다.

  • 0부터 시작하는 번호표(Index): 자바의 인덱스는 1이 아닌 0부터 시작한다. 3인승 버스라면 좌석 번호는 0, 1, 2번이 된다.

  • boolean[] arr1 = new boolean[2];
    뜻: "참/거짓(boolean)만 들어갈 수 있는 2칸짜리 상자를 만들고, 그 상자 이름을 arr1이라고 부를게!"


3. 클래스(Class)와 객체

객체를 실제 제품이라고 한다면, 클래스는 그 제품을 만들기 위한 설계도다. 클래스 하나를 정의하면 다음과 같은 세 가지 작업이 가능해진다.

  1. 객체 생성: 메모리 공간에 실제 데이터를 담을 본체를 만든다.
  2. 리모컨 제작: 객체를 조종할 수 있는 도구를 만든다.
  3. 참조 변수 생성: 리모컨을 보관할 수 있는 변수(수납함)를 만든다.

4. 리모컨 시스템: 참조(Reference)

객체는 여러 데이터의 조합이기 때문에 덩치가 매우 크다. 반면 변수는 작은 값 하나만 들어갈 수 있는 좁은 공간이다. 따라서 객체 본체를 변수에 직접 넣는 것은 불가능하다.

이 문제를 해결하기 위해 자바는 리모컨 시스템을 사용한다.

  • 원리: 실제 객체는 메모리의 넓은 곳에 두고, 변수에는 그 객체를 찾아가 조종할 수 있는 주소값(리모컨)만 저장한다.
  • 공유의 위험성: int[] arr2 = arr1;과 같은 코드는 버스를 한 대 더 만드는 것이 아니라, 기존 버스의 리모컨을 복사하는 것이다. 따라서 arr2로 내부 값을 바꾸면 arr1으로 확인했을 때도 값이 바뀌어 있다. 같은 버스를 두 개의 리모컨으로 조종하는 셈이기 때문이다.

5. new 연산자와 this

코드에서 new 사람();을 실행하면 메모리에는 두 가지가 생성된다.

  1. 객체 본체: 데이터를 저장할 실제 공간이다.
  2. 자기 자신용 리모컨 (this): 객체는 태어날 때부터 내부에 자기 자신을 가리키는 리모컨을 하나 가지고 있다. 이를 this라고 부른다. 객체 내부에서 자신의 속성에 접근할 때 이 리모컨을 사용한다.

6. 정리

  • 변수는 한 번에 하나만 담는 상자다.
  • 객체는 여러 데이터를 묶어서 관리하는 커다란 바구니다.
  • 클래스는 그 바구니를 어떻게 만들지 적어둔 설계도다.
  • 객체는 변수에 직접 들어가지 못하므로 리모컨(주소)을 통해 원격 조종한다.

코드 예시

int[] arr4 = new int[10];
    arr4[0] = 1;
    arr4[1] = 2;
    arr4[2] = 3;
    arr4[3] = 4;
    arr4[4] = 5;
    arr4[5] = 6;
    arr4[6] = 7;
    arr4[7] = 8;
    arr4[8] = 9;
    arr4[9] = 10;
    
    // 배열 안에 뭐가 들어있는지 확인하고는 싶고, 반복문을 돌리기가 귀칞을때 Arrays.toString() 을 사용.
    // 한 줄로 보기편하게 출력된다.
    
    System.out.println(Arrays.toString(arr4));
    
 => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 이런 식으로 출력됨


1. OOP

OOP(Object-Oriented Programming)는 프로그램을 단순히 순서대로 실행하는 명령어의 나열로 보지 않는다. 대신, 프로그램을 구성하는 여러 요소들을 하나의 '객체(Object)'라는 부품으로 만들고, 이 부품들을 조립하여 전체 시스템을 완성하는 방식이다.

쉽게 말해, 자동차를 통째로 한 번에 깎아서 만드는 것이 아니라 엔진, 바퀴, 핸들을 각각 따로 만든 뒤 조립하는 것과 같다.


2. OOP 이유 (조립식 사고의 장점)

과거의 절차지향 방식은 마치 긴 줄글로 된 요리 레시피와 같았다. 중간에 재료 하나만 바뀌어도 전체 순서를 다 뒤져야 했다. 하지만 객체 지향은 다음과 같은 강력한 장점을 가진다.

  • 유지보수: 바퀴가 고장 나면 전체를 버리지 않고 '바퀴 객체'만 교체하면 된다.
  • 재사용성: 잘 만든 '엔진' 부품은 다른 자동차를 만들 때도 그대로 가져다 쓸 수 있다.
  • 협업: "너는 핸들 만들고, 나는 타이어 만들자"라며 역할을 나누기 매우 유리하다.

3. OOP를 지탱하는 4대 특징 (4대 기둥)

OOP를 제대로 이해하려면 다음 4가지 핵심 개념을 반드시 알아야 한다.

① 캡슐화 (Encapsulation): "정보 보호와 리모컨"

관련된 데이터와 기능을 하나의 주머니(객체)에 담고, 내부의 복잡한 동작은 숨기는 것이다.

  • 핵심: 사용자는 내부 부품이 어떻게 돌아가는지 몰라도 제공된 리모컨(메서드) 버튼만 누르면 된다.
  • 이유: 외부에서 중요한 데이터를 마음대로 주무르지 못하게 보호하기 위해서다.

② 상속 (Inheritance): "설계도의 대물림"

이미 잘 만들어진 부모 설계도의 기능을 자식 설계도가 그대로 물려받는 것이다.

  • 핵심: '자동차' 설계도가 있다면 이를 상속받아 '구급차'나 '소방차'를 만든다.
    공통 기능은 다시 만들 필요 없이 추가하고 싶은 기능만 새로 적으면 된다.
  • 이유: 코드의 중복을 없애고 개발 속도를 비약적으로 높여준다.

③ 추상화 (Abstraction): "핵심만 남기기"

복잡한 실체에서 불필요한 부분은 빼고 공통적이고 중요한 특징만 뽑아내는 과정이다.

  • 핵심: 운전자가 엔진의 폭발 원리까지 알 필요는 없다. 핸들, 페달 등 운전에 꼭 필요한 요소만 추려내어 '운전석'이라는 인터페이스를 만드는 것이 추상화다.
  • 이유: 복잡한 시스템을 단순하게 구조화하여 이해하기 쉽게 만든다.

④ 다형성 (Polymorphism): "다양한 형태의 변신"

똑같은 명령을 내려도 연결된 객체에 따라 서로 다른 결과가 나타나는 마법이다.

  • 핵심: '공격'이라는 버튼 하나로 전사는 칼을 휘두르고, 마법사는 불꽃을 쏜다. 나는 어떤 객체든 상관없이 그냥 '공격' 버튼만 누르면 된다.
  • 이유: 코드를 유연하게 만들어 새로운 기능을 추가하거나 객체를 교체하기 매우 쉽게 해준다.

4. 요약

  • 클래스(Class): 붕어빵 틀 (설계도)
  • 객체(Object): 실제 붕어빵 (부품)
  • OOP: 부품을 규격에 맞게 잘 설계하고(캡슐화, 추상화), 기존 부품을 개량하며(상속), 상황에 따라 자유자재로 활용하는(다형성) 프로그래밍 전략이다.
profile
성심당마스코트

0개의 댓글