프로젝트에서 보기 →

자바 코딩 무료 강의 (기본편) - 9시간 뒤면 여러분도 개발자가 될 수 있어요

태그
교육
시작일
종료일
수정일

https://www.youtube.com/watch?v=NQq0dOoEPUM

# 1. 이건 꼭 알아야 한다[^1]

[? 질문] 자바를 왜 배우고, 어디에 쓰이며, 이 강의(기본편 9시간)로 어디까지 할 수 있는가[^2]
[= 답] 자바는 2022년 11월 기준 인기 순위 3위로 수요가 꾸준하고(웹/안드로이드/데스크톱/자동화/데이터/코테 등 활용처 다수), 이 영상(9시간)은 환경 설정부터 메소드까지를 다뤄 “자바 문법의 기초”와 “간단한 프로그램을 스스로 만드는 수준”까지를 목표로 한다.[^2]

[? 질문] 코딩을 처음 접하는 사람이 이 강의를 어떻게 공부해야 가장 효율적인가(외우기 vs 이해/복습/퀴즈)?[^3]
[= 답] 코드를 억지로 외우기보다 “단계적으로 작성→파일을 챕터별로 쪼개 관리→필요 시 돌아가 복습” 구조를 활용하고, 실무처럼 구글링을 활용하며, 각 장 끝의 퀴즈를 반드시 직접 풀어보는 과정에서 이해와 정리가 완성되도록 학습한다.[^3]

[? 질문] 자바 개발을 위해 가장 먼저 준비해야 할 것은 무엇이며(특히 초보자), 강의는 어떤 도구/버전을 기준으로 진행되는가?[^4]
[= 답] 자바 실행/개발을 위해 **JDK 설치(오픈JDK 8 중심)**와 IDE(IntelliJ Community) 설치가 선행되며, 윈도우/맥 각각 설치·환경변수·실행 확인까지 안내한다.[^4]


# 2. 큰 그림[^5]

이 콘텐츠는 나도코딩 채널의 **자바 무료 강의(기본편)**로, 자바 개발 환경 구축부터 시작해 자료형/변수/연산자/문자열/제어문(조건·반복)/배열/메소드까지 “프로그래밍 입문자가 실습으로 따라오며 기초 문법을 체득”하도록 구성된 장시간 강의다.[^5] 초보자를 위해 생활 비유(커피, 배송 문자, 결혼식 사회, 신발 구매, 영화관 좌석, 치킨집 대기 등)를 사용해 개념을 설명하고, 각 챕터 말미에 퀴즈로 스스로 구현해보게 한다.[^5]

  • 실무 관점: 코드 사용법은 외우는 대상이 아니라 필요 시 검색/복습/재사용하는 대상이며, 학습 설계도 이를 전제로 한다.[^3]
  • 점진적 난이도: 출력→자료형/변수→연산자→문자열→제어문→배열→메소드(전달값/반환값/오버로딩/스코프/메인 인자) 순으로 확장한다.[^6]
  • 환경/도구 표준화: 실습이 막히지 않도록 JDK 설치, 환경변수(PATH/JAVA_HOME), IntelliJ 프로젝트 생성·실행·편의 설정까지 “동일한 출발선”을 만든다.[^4]

# 3. 하나씩 살펴보기[^7]

## 3.1 강의 소개: 자바의 가치, 학습 범위, 공부법, 퀴즈의 역할[^2]

강의는 “9시간 분량”이며, 유튜브 영상에서는 **환경 설정부터 메소드까지(총 7개 챕터)**를 다룬다고 안내한다.[^2] 이후 클래스부터 입출력까지 포함한 **20시간 풀버전(추가 11시간, OOP 심화: 클래스/상속/다형성/추상/인터페이스 등)**은 인프런에서 제공된다고 구분한다.[^2] 자바의 시장 수요(2022년 11월 기준 인기 3위)와 버전 업데이트/수요 지속을 근거로 “배울 이유가 충분한 언어”라고 말한다.[^2]

자바 활용처로는 다음을 예시로 든다.[^2]

  • 웹 애플리케이션 개발: 쇼핑몰에서 회원가입/로그인/상품조회/주문 등 많은 과정에 자바가 쓰일 수 있으며, 웹에 관심 있으면 스프링 프레임워크를 추가로 찾아보라고 한다.[^2]
  • 모바일 앱(안드로이드) 개발: 안드로이드 앱 개발에 사용 가능.[^2]
  • 데스크톱 앱 개발: 윈도우/맥 프로그램 형태로 개발 가능.[^2]
  • 그 외: 웹 자동화, 머신러닝, 데이터 분석, 코딩 테스트 언어 선택 등.[^2]

“누가 배우면 좋은가”에 대해서는 컴퓨터 전공/진학 예정자(객체지향 이해에 도움), 취업 준비자(기회가 상대적으로 많음), 개인/팀 프로젝트 수행자(웹/모바일 프로젝트에 도움) 등을 제시한다.[^2]

공부 방법 안내는 다음 메시지가 핵심이다.[^3]

  • 코딩 완전 초보도 들을 수 있도록 익숙한 예시로 설명한다.[^3]
  • 코드/기능 사용법을 모두 외울 필요가 없다(강사도 다 외우지 못한다고 말함).[^3]
  • 잊어도 괜찮도록 “단계적 작성, 파일을 작은 단위로 분리”해 앞부분 복습이 쉽도록 구성했다.[^3]
  • 실무에서는 구글링이 일반적이므로 억지 암기보다 찾아쓰는 능력을 강조한다.[^3]
  • 환경설정을 제외한 모든 장이 끝날 때마다 퀴즈 제공: 앞에서 배운 내용 기반으로 새 프로그램을 직접 만들어보며, 스스로 정리/접근을 고민하는 과정에서 실력이 붙는다.[^3]
  • 퀴즈가 어려우면 이전 내용/소스 참고 가능하나, 해설 코드를 외우면 안 되고 “왜 이렇게 작성했는지, 접근법”을 이해한 뒤 다시 직접 풀어보라고 권한다.[^3]

## 3.2 윈도우 개발 환경 설정: OpenJDK 8 설치, 환경변수(JAVA_HOME, PATH), IntelliJ 설치/프로젝트 생성/실행 확인[^4]

3.2.1 JDK가 필요한 이유와 설치(윈도우)[^4]

자바 프로그램 개발/실행에는 **JDK(Java Development Kit)**가 필요하며, 무료로 쓸 수 있는 OpenJDK를 설치한다고 한다.[^4] 다운로드는 Adoptium(이클립스 재단 관리) 사이트를 이용하고, 최신 LTS(예: 17)도 있지만 실무에서 많이 쓰는 8 버전을 사용한다고 설명한다.[^4] LTS가 장기 지원 버전이라는 개념도 함께 소개한다.[^4]

윈도우에서는:

  • Adoptium에서 버전을 8로 필터링하고, OS를 Windows로 선택하며, 32/64비트에 맞는 설치 파일을 고른다.[^4]
  • MSI 설치를 선택해 환경변수까지 자동 설정되게 한다고 말한다.[^4]
  • 설치 경로를 C:\Java\... 형태로 바꾸어 여러 JDK 버전을 한 폴더에서 관리하기 쉽게 한다.[^4]
  • 옵션 중 Set JAVA_HOME variable 설치를 체크해 JAVA_HOME 환경변수까지 잡히게 한다.[^4]

설치 확인은 cmd에서 java -version을 실행해 OpenJDK 1.8이 출력되는지 본다(1.8 = 8).[^4] 만약 버전이 안 뜨면 환경변수를 수동으로 설정한다.[^4]

3.2.2 환경변수 수동 설정(윈도우): JAVA_HOME, PATH 우선순위[^4]

환경변수 편집에서:

  • 시스템 변수에 JAVA_HOME을 만들고 JDK 설치 경로를 지정한다.[^4]
  • PATH에 %JAVA_HOME%\bin;맨 위에 두도록(경로 탐색이 위에서 아래로 진행, 다른 JDK가 먼저 잡힐 수 있음) 텍스트 편집 모드로 추가한다.[^4]
  • 적용 후 cmd를 새로 열어 java -version을 재확인한다.[^4]

3.2.3 IDE(IntelliJ) 설치(윈도우) 및 기본 설정[^4]

IDE는 통합 개발 환경이며, 메모장 개발은 불편하고 에러 확인도 어렵기 때문에 IDE 사용을 권장한다.[^4] 강의에서는 IntelliJ IDEA를 사용하며, 유료 Ultimate가 아닌 무료 Community 버전을 설치한다.[^4]

설치 옵션에서:

  • 바탕화면 바로가기, “프로젝트로 폴더 열기”, 환경변수 등록, .java 파일 연결 등 체크 항목을 소개한다.[^4]

실행 후:

  • 새 프로젝트 Java Workspace를 만들고, 위치를 바탕화면으로 지정하는 방법을 안내한다.[^4]
  • JDK 1.8을 선택하고 생성한다.[^4]
  • 기본 생성된 Hello World를 실행(초록색 실행 버튼)하여 출력 확인한다.[^4]

편의 설정으로:

  • Settings > Editor > General에서 “Ctrl + Mouse Wheel로 폰트 크기 변경” 옵션을 켜서 확대/축소를 쉽게 한다.[^4]

## 3.3 맥 개발 환경 설정: Homebrew, OpenJDK 8, 환경변수(.bash_profile), IntelliJ 설치/실행/설정[^4]

맥에서는 Homebrew를 패키지 관리자로 소개하며(설치/삭제/업데이트/관리 용이), 홈브루 설치 명령을 홈페이지에서 복사해 터미널에 붙여 넣고 진행한다.[^4] 설치 과정에서 “Next steps”로 환경변수 등록 명령이 뜰 수 있으며, 안내된 두 줄을 실행하라고 말한다.[^4]

OpenJDK 설치는 brew로 진행한다.[^4]

  • brew tap adoptopenjdk/openjdk로 저장소 추가[^4]
  • brew search jdk로 목록 확인 후 adoptopenjdk8 설치[^4]
  • 설치 후 java -version으로 1.8 확인[^4]

환경변수가 필요할 경우:

  • /Library/Java/JavaVirtualMachines/.../Contents/Home 경로를 찾아 JAVA_HOME으로 export하고, PATH$JAVA_HOME/bin을 추가한다.[^4]
  • .bash_profile이 없으면 touch ~/.bash_profile로 만든 후 편집(예: open -e ~/.bash_profile)해 export 구문을 추가한다.[^4]
  • source ~/.bash_profile로 적용한 뒤 java -version 재확인한다.[^4]

IntelliJ는 brew cask로 커뮤니티 버전을 설치하고, 실행 후 새 프로젝트를 만들고(데스크톱 위치), Hello World 실행, 테마/폰트 확대(Preferences의 command+wheel 옵션) 등을 동일하게 안내한다.[^4]


## 3.4 IntelliJ 화면 구성 이해 + 첫 자바 파일 직접 만들기(패키지/클래스/메인/출력/실행 단축키)[^6]

IntelliJ 화면을 3개 영역으로 비유해 설명한다.[^6]

  1. 왼쪽 Project 뷰: 프로젝트 구조(특히 src)에서 소스코드를 작성/관리.[^6]
  2. 가운데 코드 에디터: 소스코드 작성 “주 무대”. 탭으로 여러 파일 전환.[^6]
  3. 아래 실행 결과/에러 출력 영역: 실행 결과(Hello World) 및 오류 확인.[^6]

실습 흐름은 다음과 같다.[^6]

  • 자동 생성된 Main.java를 삭제하고, 챕터별 관리 목적의 패키지(폴더) 생성: chap_01.[^6]
  • 패키지 안에 새 Java Class 생성: _01_HelloWorld.[^6]
  • 탐색기(Explorer/Finder)에서 실제 폴더 구조(src/chap_01/_01_HelloWorld.java)도 확인시켜 “프로젝트 구조와 파일 관계”를 이해시키려 한다.[^6]

코드 작성:

  • public static void main(String[] args) { ... }를 입력해 메인 영역을 만들고, 그 안에서 System.out.println("Hello World!");로 출력.[^6]
  • 저장(Ctrl+S) 후 실행(초록색 버튼 또는 Shift+F10)으로 출력 확인.[^6]
  • 문자열 내용 변경(느낌표 추가, “안녕하세요”) 후 재실행해 출력 변경을 확인한다.[^6]

코드 의미를 “당장은 몰라도 된다”는 태도를 유지하되, println이 한 줄 출력이라는 의미, 큰따옴표 내부가 출력 내용이라는 정도를 간단히 풀어준다.[^6]


## 3.5 자료형(Data Types): 문자열/숫자(정수·실수)/불리언, 출력과 연산, 가독성(들여쓰기·띄어쓰기)[^8]

새 파일 _02_DataTypes를 만들고, IntelliJ 단축 입력을 소개한다.[^8]

  • 메인 자동 생성: psvm 또는 main 입력 후 엔터 → public static void main... 생성.[^8]
  • 출력 자동 생성: sout 입력 후 엔터 → System.out.println() 생성.[^8]

실습은 출력 중심으로 진행된다.[^8]

  • 문자열 출력: "Hello World", "안녕하세요"처럼 큰따옴표로 감싼 텍스트.[^8]
  • 정수 출력: 12, -34 등 따옴표 없이 숫자 자체.[^8]
  • 실수 출력: 3.14 등 소수점 포함 숫자.[^8]
  • 불리언 출력: true, false (따옴표 없이) — 전등 스위치 온/오프처럼 “두 상태값”에 비유.[^8]

추가로 계산 출력:

  • 123 + 345println 안에 넣으면 계산 결과(468)가 출력됨을 보여준다.[^8]

코드 스타일:

  • 띄어쓰기/들여쓰기는 실행 결과에 영향은 없지만 가독성을 높이기 위해 권장한다고 말한다.[^8]

## 3.6 변수(Variables): 값 저장 공간, 문자열 결합, 타입별 변수, 업데이트(재대입), float/double 정밀도, long 범위, 숫자 리터럴 언더바, “컵 크기” 비유[^9]

변수는 “데이터/값을 저장하는 공간”이라고 정의한다.[^9] 배송 문자 예시로, 같은 이름(“나도코딩님”)이 여러 문장에 반복될 때 매번 하드코딩하지 말고 변수에 저장 후 재사용하자고 설명한다.[^9]

3.6.1 String 변수, 대입(=)의 의미[^9]

  • 선언: String name;
  • 대입: name = "나도코딩"; 혹은 선언+초기화: String name = "나도코딩";[^9]
  • 수학의 등호(좌우 같음)와 달리 프로그래밍의 =는 “오른쪽 값을 왼쪽 변수에 넣는다”는 의미라고 강조한다.[^9]

문자열 결합:

  • "나도코딩님 배송이 시작됩니다"에서 이름 부분을 name + "님 배송이 시작됩니다"로 바꿔 출력한다.[^9]

3.6.2 int, double, char, boolean 변수 + 출력 조합[^9]

  • int hour = 15;로 방문 예정 시간 문자열에 숫자를 결합한다: name + "님 ... " + hour + "시에 ..."[^9]
  • 실수: double score = 90.5;[^9]
  • 문자 1글자: char grade = 'A'; (작은따옴표 사용) — 문자열은 큰따옴표, char는 작은따옴표 차이를 강조.[^9]
  • 불리언: boolean pass = true/false; — 시험 합격 여부 예시로 출력.[^9]

변수 업데이트:

  • name = "강백호";처럼 값은 언제든 바뀔 수 있음을 보여주고, 업데이트 후 출력에서 변경이 반영됨을 확인한다.[^9]

3.6.3 float vs double: 실수 기본 리터럴과 정밀도, float에는 f 필요[^9]

  • double d = 3.14;는 문제 없음.[^9]
  • float f = 3.14;는 오류: 실수 리터럴은 기본이 double로 인식되기 때문에 float에 바로 넣을 수 없다고 설명.[^9]
  • 해결: float f = 3.14F;처럼 뒤에 F(또는 f)를 붙여 float 리터럴임을 명시.[^9]
  • 정밀도 비교: 소수점 이하를 길게 늘려 double은 더 많은 자리 표현, float은 일정 자리에서 반올림/절삭되는 출력 결과로 차이를 보여준다.[^9]

3.6.4 int 범위와 long, long 리터럴 L, 숫자 가독성 언더바[^9]

  • 큰 정수는 int 범위를 넘을 수 있으며, long은 더 큰 범위를 가진다고 설명.[^9]
  • long 리터럴은 뒤에 L을 붙여야 오류가 사라진다는 점을 보여준다.[^9]
  • 숫자에 _를 넣어 1_000_000_000_000L처럼 3자리씩 끊어 가독성을 높일 수 있으며 동작은 동일하다고 한다.[^9]
  • 범위 선택 비유: 작은/큰 컵만 있는 커피숍에서 “큰 커피를 작은 컵에 담으면 넘친다(오버플로/범위 초과)”, “작은 커피를 큰 컵에 담으면 공간 낭비(불필요하게 큰 타입)”라고 비유하며 “데이터 범위에 맞는 자료형 선택”을 강조한다.[^9]

## 3.7 주석(Comments): 실행 제외, 설명 메모, 한 줄/여러 줄, 단축키[^10]

주석은 코드에서 실행을 원하지 않는 부분을 무시시키거나, 설명을 달기 위한 용도라고 설명한다.[^10]

  • 결혼식 사회 멘트 예시: 10분 전/5분 전 안내 중, 5분 전 멘트를 생략하고 싶을 때 종이처럼 “줄을 긋는 대신” 주석 처리로 실행을 막는다.[^10]
  • 한 줄 주석: //로 문장 앞(또는 뒤)에 붙이면 해당 부분은 실행되지 않는다.[^10]
  • 신발 사이즈 예시: size = size + 10;에 “어린이는 발이 빨리 자라서 10 더 큰 신발 구매” 같은 설명을 주석으로 달아 협업/미래의 나를 돕는다.[^10]
  • 여러 줄 주석: /* ... */로 범위 전체를 주석 처리.[^10]

IntelliJ 단축키:

  • 한 줄 주석 토글: Ctrl + /[^10]
  • 여러 줄 주석 토글: Ctrl + Shift + /[^10]
  • 단축키가 안 먹으면 한/영키를 눌러보라고 팁을 준다.[^10]

## 3.8 변수 네이밍(Variable Naming): 규칙 6가지, 카멜케이스, 언더스코어/숫자, 금지 사례, 상수는 대문자[^11]

변수명 규칙을 주석으로 정리하고, 입국신고서 작성 예시로 다량의 변수를 만들며 연습한다.[^11]

규칙 요지:

  1. 저장할 값에 어울리는 이름(빨래바구니에 “쓰레기통”이라고 쓰면 혼란) — 의미 있는 이름.[^11]
  2. 밑줄/문자/숫자 사용 가능, 공백은 불가.[^11]
  3. 변수명은 밑줄 또는 문자로 시작(숫자로 시작 불가).[^11]
  4. 한 단어 또는 여러 단어 조합 가능.[^11]
  5. 보통 소문자로 시작, 여러 단어면 다음 단어 첫 글자 대문자(camelCase) 사용.[^11]
  6. 예약어(public, static, int, double 등) 사용 불가.[^11]

입국신고서 예시 변수:

  • nationality, firstName, lastName, dateOfBirth, residentialAddress, purposeOfVisit 등으로 2~3단어 조합과 대문자 구분을 보여준다.[^11]
  • 밑줄 시작 _flightNumber, 중간 밑줄 flight_number2 등도 가능하나, 하이픈 -flightNumber는 불가(에러) 예시.[^11]
  • 숫자로 시작 3item은 불가(에러) 예시.[^11]

이름이 덜 중요할 때(반복문 인덱스 등)는 i, s, str처럼 간단히 쓸 수 있다고도 말한다.[^11]

상수(constant) 언급:

  • 상수는 값이 바뀌지 않으므로 보통 대문자로 쓰며, final을 붙이면 상수가 된다고 예고한다.[^11]

## 3.9 상수(Constants): final, 변경 불가, 예시(국가번호, 원주율, 생년월일), 대문자+언더스코어[^12]

변수는 변할 수 있지만 상수는 한 번 정의하면 수정 불가라고 정의한다.[^12]

예시:

  • 국가번호 +82(한국)처럼 바뀔 일이 없는 값은 상수로 선언이 적절하다고 설명.[^12]
  • final String KR_COUNTRY_CODE = "+82"; 형태로 만들고, 바꾸려 하면 “final variable에는 값을 할당할 수 없다” 오류가 난다고 보여준다.[^12]
  • 원주율: final double PI = 3.141592...[^12]
  • 생년월일: 나이는 변하지만 태어난 날짜는 고정이므로 상수로도 볼 수 있다고 한다.[^12]
  • 상수는 대문자이며, 여러 단어는 _로 구분하면 가독성이 좋아진다고 강조.[^12]

## 3.10 형 변환(Type Casting): 숫자형 자동/명시 변환, 소수점 절삭, 문자열↔숫자 변환, 파싱 오류[^13]

형 변환은 정수↔실수처럼 타입을 바꾸는 것이라고 정의한다.[^13]

3.10.1 int → float/double (명시 캐스팅으로 출력)[^13]

  • int score = 93; 출력은 93.[^13]
  • (float) score는 93.0, (double) score도 93.0 형태로 출력.[^13]
  • 93과 93.0은 사람 눈엔 비슷하지만 컴퓨터에겐 타입 차이가 크다고 언급.[^13]

3.10.2 float/double → int (명시 캐스팅 필요, 소수점 버림)[^13]

  • float score_f = 93.3f;(int)score_f 하면 93 (소수점 버림).[^13]
  • double score_d = 98.8;(int)score_d 하면 98.[^13]

3.10.3 정수+실수 연산 결과의 타입 문제와 해결[^13]

  • int score = 93 + 98.8;은 결과가 double이라 int에 못 넣어 에러.[^13]
  • 해결: (int)98.8을 넣어 93 + 98로 만들면 int에 저장 가능(191).[^13]
  • 반대로 double score_d = 93 + 98.8;은 자동으로 double로 처리되어 191.8이 된다(명시 변환 없이도 가능).[^13]

3.10.4 자동 형변환 방향(작은 범위→큰 범위) vs 큰 범위→작은 범위[^13]

  • int→long→float→double처럼 범위가 커지는 방향은 자동 변환 가능.[^13]
  • double→int처럼 줄어드는 방향은 데이터 손실 가능(소수점 버림 등)이라 명시 캐스팅 필요.[^13]

3.10.5 숫자 ↔ 문자열 변환(클래스 메서드 활용)[^13]

  • 숫자→문자열:
    • String.valueOf(93) 또는 Integer.toString(93)[^13]
    • 실수는 String.valueOf(98.8) 또는 Double.toString(98.8)[^13]
  • 문자열→숫자:
    • Integer.parseInt("93")[^13]
    • Double.parseDouble("98.8")[^13]
  • 파싱 오류 예시: Integer.parseInt("Java")는 숫자가 아니므로 실행 시 오류가 나고 프로그램이 종료됨을 보여준다.[^13]

## 3.11 퀴즈 1: 버스 도착 정보 출력(자료형/변수/출력 결합)[^14]

문제: “버스 도착 정보를 출력하는 프로그램” 작성. 각 정보는 적절한 자료형의 변수에 정의.[^14]
정보 3가지:

  • 버스 번호: 1234 또는 상암 08처럼 문자+숫자 혼합 가능 → 문자열 적합.[^14]
  • 남은 시간: 분 단위 정수(3분, 5분 등) → int.[^14]
  • 남은 거리: km 단위 실수(1.5km, 0.8km 등) → double/float.[^14]

요구 출력 예:

  • 상암 08번 버스
  • 약 3분 후 도착
  • 남은 거리는 1.2km[^14]

해설에서는:

  • String busNumber = "상암 08";
  • int minute = 3;
  • double distance = 1.2;
  • 출력은 문자열 결합으로 구성(busNumber + "번 버스", "약 " + minute + "분 후 도착", "남은 거리는 " + distance + "km").[^14]
    데이터를 바꾸면 출력도 즉시 바뀐다는 점을 보여주며 마무리한다.[^14]

## 3.12 챕터 2 연산자(Operator 1~5): 산술/대입/비교/논리/삼항 + 퀴즈 2(놀이기구 탑승)[^15]

3.12.1 산술 연산자(+, -, *, /, %)와 정수 나눗셈의 특징[^15]

  • 기본 연산: 4+2, 4-2, 4*2(별표), 4/2(슬래시) 실습.[^15]
  • 정수 나눗셈: 5/2는 2.5가 아니라 2(소수점 버림), 2/4는 0.5가 아니라 0이 됨을 강조.[^15]
  • 나머지 연산자 %: 4%2=0, 5%2=1.[^15]
  • 우선순위: 2 + 2 * 2는 곱셈 우선으로 6. 괄호로 (2+2)*2=8 가능.[^15]

변수로 연산:

  • int a=20, b=10, c;c=a+b, c=a-b 등으로 업데이트/출력.[^15]

증감 연산자:

  • ++value(전위): 증가 후 사용, value++(후위): 사용 후 증가 차이를 출력 결과로 비교.[^15]
  • 감소도 동일(--value, value--).[^15]
  • 은행 대기표 비유로 후위 증가(waiting++)가 “현재 대기 인원 출력 후 다음 사람 위해 +1”에 적합함을 설명한다.[^15]

3.12.2 대입 연산자와 복합 대입(+=, -=, *=, /=, %=)[^16]

  • num = num + 2 같은 패턴을 num += 2로 줄일 수 있고, 같은 방식으로 -=, *=, /=, %=를 소개한다.[^16]
  • 같은 변수를 “연산 후 자기 자신에 다시 대입”할 때만 가능하다고 설명한다.[^16]

3.12.3 비교 연산자(>, >=, <, <=, ==, !=)와 결과는 boolean[^17]

  • 5 > 3은 true, 5 >= 5도 true, 5 >= 7은 false 등 출력 확인.[^17]
  • 같음 비교는 ==, 같지 않음은 !=로 출력해 true/false를 확인.[^17]

3.12.4 논리 연산자(||, &&)와 부정(!), 연속 비교 불가[^18]

김치찌개/계란말이/제육볶음 메뉴 비유로 boolean 변수 3개를 두고:

  • OR(||): 하나라도 true면 true.[^18]
  • AND(&&): 모두 true일 때만 true.[^18]
  • !true → false, !false → true.[^18]
  • 1 < 3 < 5 같은 연속 비교는 불가능하고 (1<3) && (3<5)처럼 분리해야 한다고 주의.[^18]

3.12.5 삼항 연산자(조건 ? 참 : 거짓)[^19]

형태를 주석으로 정리 후:

  • max = (x > y) ? x : y;로 최대값.[^19]
  • min = (x < y) ? x : y;로 최소값.[^19]
  • 문자열 결과도 가능: (x != y) ? "달라요" : "같아요".[^19]

3.12.6 퀴즈 2: 키(120cm) 탑승 가능 여부(삼항 연산자)[^20]

조건: 키가 120cm 이상이면 탑승 가능, 아니면 불가. 삼항 연산자 사용.[^20]
해설:

  • int height = 115;
  • String result = (height >= 120) ? "탑승 가능합니다" : "탑승 불가능합니다";
  • 출력: "키가 " + height + "cm이므로 " + result[^20]
    값을 120/121 등으로 바꿔 결과가 바뀌는 것도 확인한다.[^20]

## 3.13 챕터 3 문자열(String) 심화: 길이/대소문자/포함/위치/시작·끝/변환(replace, substring, trim)/결합(+ vs concat)/비교(equals vs ==)/특수문자(escape) + 퀴즈 3(주민번호)[^21]

3.13.1 String 기본 기능(길이·대소문자·포함·인덱스·시작/끝)[^21]

문자열 I like Java and Python and C.를 예시로 든다.[^21]

  • 길이: s.length()가 29를 출력(인텔리제 선택 영역 캐릭터 수 표시도 보여줌).[^21] 리뷰 최소 글자 수 체크 같은 실무 상황을 예로 든다.[^21]
  • 대문자/소문자 변환: toUpperCase(), toLowerCase().[^21]
  • 포함 여부: contains("Java") → true, contains("C#") → false.[^21]
  • 위치: indexOf("Java") → 7 (인덱스는 0부터 시작). 포함 안 되면 -1 반환.[^21]
  • 여러 번 등장하는 문자열의 마지막 위치: lastIndexOf("and")로 23을 얻는 예시.[^21]
  • 시작/끝: startsWith("I like"), endsWith(".")로 true 확인.[^21]

3.13.2 문자열 변환: replace, substring(시작/끝-직전), trim, 결합(+/concat)[^22]

  • replace(" and ", ", ")로 and를 콤마로 바꾼 출력.[^22]
  • substring(7)로 “Java…”부터 끝까지 자르기(7은 직접 세거나 indexOf("Java")로 구함).[^22]
  • substring(indexOf("Java"), indexOf("."))처럼 시작/끝 위치를 주면 “끝 인덱스 직전까지” 잘린다는 규칙을 강조.[^22]
  • 공백 제거: 앞뒤 불필요 공백이 많은 " I love Java. "trim() 적용해 비교 출력.[^22]
  • 결합:
    • s1 + s2 방식, s1 + ", " + s2 방식.[^22]
    • concat()으로 s1.concat(", ").concat(s2)도 가능하다고 소개.[^22]

3.13.3 문자열 비교: equals / equalsIgnoreCase / ==의 차이(참조 vs 내용), “화장실 비밀번호 메모지” 비유[^23]

  • 내용 비교는 equals() 사용: "Java".equals(...) 형태로 true/false 확인.[^23]
  • 대소문자 무시 비교는 equalsIgnoreCase().[^23]
  • == 비교는 경우에 따라 true가 나오기도 하지만(문자열 리터럴 공유) new String("1234")처럼 새 객체로 만들면 ==은 false가 될 수 있음을 보여준다.[^23]
  • 비유: 벽에 붙은 비밀번호 메모지(하나를 모두가 참조) vs 테이블마다 새 메모지(서로 다른 참조). equals는 “내용”, ==는 “참조(같은 메모지인가)” 비교라고 설명한다.[^23]
  • 결론으로 “자바에서 문자열 내용 비교는 equals를 써야 한다”만 기억해도 된다고 한다.[^23]

3.13.4 특수문자(escape sequence): \n, \t, \, ", ' + char에서 ' 필요[^24]

  • \n 줄바꿈으로 여러 줄 출력.[^24]
  • \t 탭으로 메뉴/가격 정렬(해물파전 9000원 등) 예시.[^24]
  • 윈도우 경로 표현 C:\Program Files\Java\\로 써야 한다고 설명(그냥 \P 같은 건 잘못된 escape).[^24]
  • 문자열 안에 큰따옴표 출력은 \" 사용(“담비가 "냐옹"이라고 했어요”).[^24]
  • 작은따옴표는 문자열에서는 그냥 써도 되지만, char c = '\'';처럼 char에 작은따옴표 자체를 넣으려면 \'가 필요하다고 보여준다.[^24]

3.13.5 퀴즈 3: 주민등록번호에서 생년월일+성별까지만 출력[^25]

입력: 하이픈 포함 14자리 문자열 예: 901231-1234567, 030708-4567890.[^25]
출력: 앞 6자리 + 하이픈 + 성별 1자리까지: 901231-1, 030708-4.[^25]

해설:

  • String id = "901231-1234567";[^25]
  • substring(0, 8)로 0부터 8 직전까지 자르면 901231-1이 됨(인덱스 0 시작, 성별 자리까지 포함되도록 끝 인덱스 설정).[^25]
  • 응용: 하이픈 위치 indexOf("-")를 찾아 +2 해서 성별 자리까지 포함되게 substring(0, id.indexOf("-") + 2)로도 구현 가능(하이픈 위치는 고정이라 일반화 가능).[^25]
  • 두 번째 예시 ID로 바꿔도 동일 로직으로 출력됨을 확인한다.[^25]

## 3.14 챕터 4 제어문: if/else/else if, switch-case, for/while/do-while, 중첩 반복, break/continue + 퀴즈 4(주차요금)[^26]

3.14.1 if: 조건에 따른 실행, 중괄호의 중요성, AND/OR/부정 응용(커피 예시)[^26]

커피를 오후 2시(14시) 이후 마시면 잠을 못 자서, 14시 이전이면 커피 주문하는 예시로 if를 설명한다.[^26]

  • if 조건이 참이면 실행, 거짓이면 건너뜀.[^26]
  • 문장이 1개면 중괄호 생략 가능하지만, 2개 이상이면 중괄호를 반드시 써야 한다는 사례를 보여준다(중괄호 없으면 일부 문장만 if에 묶여 의도와 다르게 실행).[^26]
  • AND 조건: 14시 이전 이면서 모닝커피를 안 마신 경우에만 주문( hour < 14 && !morningCoffee ) 같은 형태로 논리 연산자/부정 연산자도 같이 활용한다.[^26]
  • OR 조건: 14시 이후 이거나 모닝커피를 마셨으면 디카페인 주문( hour >= 14 || morningCoffee )을 보여준다.[^26]

3.14.2 else: if가 아니면 반드시 다른 행동(디카페인 주문)[^27]

  • 14시 이전이면 일반 아이스 아메리카노, 아니면 디카페인으로 반드시 1잔 주문하는 구조를 if-else로 구현한다.[^27]
  • 모닝커피 여부까지 포함한 OR 조건을 넣고, 참이면 디카페인, 아니면 일반 커피로 분기하는 예시를 확장한다.[^27]

3.14.3 else if: 여러 조건의 우선순위 분기(한라봉 에이드 → 망고주스 → 오렌지주스 → 아메리카노)[^28]

  • 한라봉 에이드가 있으면 그걸 주문, 없으면 망고주스, 그것도 없으면 오렌지주스, 다 없으면 아이스 아메리카노로 fallback 하는 흐름을 if - else if - else로 구현.[^28]
  • else if는 여러 번 사용 가능함을 보여주고, else는 필수가 아니라 “모든 조건이 거짓일 때 아무것도 하지 않게”도 가능함을 예시로 든다.[^28]

3.14.4 switch-case: 명확한 케이스 값 분기(장학금, 등급별 가격), break와 fall-through[^29]

장학금 예시:

  • 1등 전액, 2·3등 반액, 나머지 대상 아님을 if-else if로 구현한 뒤 switch-case로 다시 구현한다.[^29]
  • break가 switch를 빠져나가게 하며, break가 없으면 다음 case로 “흘러내려가며(fall-through)” 실행된다는 점을 설명한다.[^29]
  • 2와 3이 동일 동작이면 case를 합쳐 case 2: case 3: 형태로 처리 가능함을 보여준다.[^29]

등급별 가격 예시:

  • 기본 가격 7000원에, 등급(1/2/3)에 따라 1000원씩 더하는 로직을 switch에서 break 없이 흘러가게 만들어 1등급은 +1000이 3번 누적되는 구조를 시연한다.[^29]
  • if는 범위 조건(점수 90 이상 등)에 적합, switch는 명확한 값(에러코드 100/200/300 등)에 적합하다고 정리한다.[^29]

3.14.5 for: 횟수 기반 반복(매장 인사), fori 자동완성, 짝수/홀수/역순, 1~10 합(55)[^30]

매장 직원 인사 예시로 같은 문장을 복붙하면 유지보수 힘들다는 문제를 제기하고, for문으로 대체한다.[^30]

  • 구조: for(선언; 조건; 증감)[^30]
  • 예: for(int i=0; i<10; i++)로 10번 반복하며 i 출력.[^30]
  • 짝수: i += 2로 0,2,4,6,8 출력.[^30]
  • println vs print 차이(줄바꿈 유무), 빈 println()으로 줄바꿈만 가능.[^30]
  • 홀수: i를 1부터 시작해 i += 2로 1,3,5,7,9 출력.[^30]
  • 역순: for(int i=5; i>0; i--)로 54321 출력.[^30]
  • 합계: sum += i로 1~10 누적합, 중간 합을 출력하며 최종 55 확인.[^30]
  • “for는 보통 횟수가 정해진 반복”에 사용한다고 정리한다.[^30]

3.14.6 while: 조건 기반 반복(수영장 25m 발차기), 무한루프 주의[^31]

수영장 레인 25m 예시:

  • distance=25, move=0에서 while(move < distance) 동안 발차기/현재 이동거리 출력, move += 3으로 진행.[^31]
  • move가 24에서 27이 되면 조건이 거짓이 되어 종료 후 “도착하였습니다” 출력.[^31]
  • move 증가를 빼먹으면 조건이 영원히 참이 되어 무한루프가 발생하고, 출력이 끝없이 반복됨을 보여주며 Stop 버튼으로 종료한다.[^31]

3.14.7 do-while: 조건과 무관하게 최소 1회 실행(키가 25m인 사람 예시)[^32]

키가 매우 큰 사람이면 while(move + height < distance) 조건이 처음부터 거짓이라 while 내부가 1번도 실행되지 않는다.[^32]
do-while은:

  • do { ... } while(조건); 형태로 먼저 실행 후 조건 판단 → 최소 1회는 실행됨을 예시로 확인한다.[^32]

3.14.8 중첩 반복문: 별 사각형/삼각형(좌/우), 구구단 출력[^33]

  • 별 사각형(5x5): 바깥 for는 줄(세로 5번), 안쪽 for는 별(가로 5번) 출력, 각 줄 끝에 줄바꿈 출력.[^33]
  • 왼쪽 삼각형: i가 커질수록 내부 반복 횟수 j < i+1로 늘려 *, **, ***… 형태 생성.[^33]
  • 오른쪽 삼각형: 앞에 공백(또는 가시화를 위해 S)을 4 - i만큼 출력 후 별을 i+1만큼 출력하여 오른쪽 정렬 삼각형을 만든다.[^33]
  • “이중 반복문은 처음엔 어렵지만 매우 중요하고 자주 사용”한다고 강조한다.[^33]

구구단:

  • 바깥 i=2..9, 안쪽 j=1..9i + " x " + j + " = " + (i*j) 출력, 단마다 줄바꿈.[^34]
  • 단 몇 줄로 2~9단 전체 출력이 가능함을 “이중 반복의 가치”로 보여준다.[^34]

3.14.9 break: 반복 탈출(치킨집 하루 20마리 한정)[^35]

치킨집이 하루 20마리만 판매, 손님은 50명 대기 예시.[^35]

  • break 없이 if로 “재료 소진” 문구만 출력하면, 반복은 계속되어 50명까지 판매해버리는 문제를 보여준다.[^35]
  • if(i == max) { ...; break; }로 20마리 판매 시 반복문을 즉시 탈출하고 “영업 종료”로 이동한다.[^35]
  • for뿐 아니라 while에서도 동일하게 적용됨을 while 버전으로 재현한다.[^35]

3.14.10 continue: 현재 회차 건너뛰기(노쇼 손님), while에서 증감 주의[^36]

노쇼 손님(예: 17번)이 치킨을 안 찾아가면 다음 손님에게 기회가 넘어가는 상황.[^36]

  • for문에서 if(i == noShow) { 안내문; continue; }를 쓰면 판매 카운트(sold++)가 실행되지 않고 다음 i로 넘어간다.[^36]
  • while문에서 continue를 쓰면 증감문이 자동으로 실행되지 않으므로, continue 전에 인덱스를 올려야 한다는 점을 보여준다.[^36]
  • while(true) 형태로 무한 반복을 돌리되 내부에서 break 조건으로 종료하는 패턴도 소개한다.[^36]

3.14.11 퀴즈 4: 주차 요금 정산(조건문/최대요금/할인)[^37]

조건:

  • 시간당 4000원
  • 1일 최대 30000원
  • 경차 또는 장애인 차량은 최종 요금 50% 할인[^37]

예시 검증:

  • 일반 5시간 → 20000원[^37]
  • 경차 5시간 → 20000의 50% = 10000원[^37]
  • 장애인 10시간 → 40000이지만 최대 30000 적용 후 50% = 15000원[^37]

해설 구현:

  • int hour = 5;
  • boolean isSmallCar = false; boolean withDisabledPerson = false;[^37]
  • int fee = hour * 4000;
  • if(fee > 30000) fee = 30000;
  • if(isSmallCar || withDisabledPerson) fee /= 2;
  • 출력: "주차 요금은 " + fee + "원입니다"[^37]
    값을 바꾸어 예시 3개가 맞는지 실행으로 확인한다.[^37]

## 3.15 챕터 5 배열(Arrays): 개념(연속 공간, 크기 고정) 의자 비유, 선언/초기화 4가지, 인덱스 0, 값 변경, 순회(for/향상 for), 다차원 배열(영화관 좌석), 초기화/순회, ASCII 보충 + 퀴즈 5(신발 사이즈)[^38]

3.15.1 배열 개념: “공항/기차역 연결 의자” 비유(크기 고정, 중간 삽입 불가)[^38]

배열은 같은 자료형 값 여러 개를 저장하는 연속된 공간이라고 정의한다.[^38]
공항·기차역의 “여러 좌석이 붙어있는 의자”를 비유로:

  • 의자 하나(변수)는 옮기기 쉽지만, 연결 의자(배열)는 한 덩어리로 관리된다.[^38]
  • 중간에 다른 의자를 끼우거나 옆에 더 붙이는 것이 불가능하듯, 배열도 생성된 크기/형태가 고정되고 중간 삽입이 안 된다는 점을 강조한다.[^38]

3.15.2 커피 주문 변수 4개 vs 배열 1개[^38]

4명이 커피 주문:

  • 변수로 coffeeRoss, coffeeRachel, coffeeChandler, coffeeMonica를 만들고 각각 출력하면, 인원이 늘면 변수/출력이 폭증하고 변수명이 제각각이라 관리가 어렵다고 지적한다.[^38]
  • 배열을 쓰면 하나의 이름으로 여러 데이터를 관리 가능하다고 전환한다.[^38]

3.15.3 배열 선언/초기화 방법 1~4[^38]

  1. String[] coffees = new String[4]; (크기 지정)[^38]
  2. String coffees[] = new String[4]; (대괄호 위치만 다름)[^38]
  3. String[] coffees = new String[] {"아메리카노", "카페모카", "라떼", "카푸치노"};[^38]
  4. String[] coffees = {"아메리카노", "카페모카", "라떼", "카푸치노"}; (new 생략)[^38]

인덱스는 0부터 시작:

  • coffees[0]="아메리카노"coffees[3]="카푸치노"[^38]

배열 값 사용:

  • coffees[0] + " 하나"처럼 접근.[^38]
  • 값 변경도 동일하게 coffees[2] = "에스프레소"처럼 가능(라떼→에스프레소 변경 예시).[^38]

다른 자료형 배열도 가능:

  • int[] i = new int[3];, double[] d = {10.0, 11.2, 13.5};, boolean[] b = {true, false, false}; 등.[^38]
  • “선언한 자료형과 같은 값만 넣어야 한다” 주의.[^38]

3.15.4 배열 순회: for + length, 향상 for(for-each), 언제 무엇을 쓰나[^39]

커피 배열을 0/1/2/3으로 직접 출력하는 방식은 요소가 많아지면 비효율이라며, 반복문으로 순회한다.[^39]

  • 기본 for: for(int i=0; i<coffees.length; i++) print(coffees[i])[^39]
  • 배열 크기를 숫자로 하드코딩하지 말고 coffees.length를 쓰라고 강조.[^39]
  • 향상 for(for-each): for(String coffee : coffees) { ... }로 인덱스 없이 값만 순차적으로 받음.[^39]
  • 인덱스가 필요한 경우(예: 선착순 3명만 처리)에는 기본 for가 유리하고, 전 요소 순회면 향상 for가 간결하다고 비교한다.[^39]

3.15.5 다차원 배열(2차원): 영화관 좌석 예시, 접근 방식, 비정형(줄마다 길이 다름), 오류(인덱스 범위)[^40]

1차원은 선(line), 2차원은 면(직사각형)으로 설명한다.[^40]
영화관 좌석을 예로:

  • A1~A5, B1~B5, C1~C5 (3x5) 좌석 배열을 1차원 3개로 만들 수 있지만, 이를 2차원으로 묶으면 한 변수로 관리 가능하다고 한다.[^40]

2차원 배열 선언/초기화:

  • String[][] seats = { {"A1","A2","A3","A4","A5"}, {"B1"...}, {"C1"...} };[^40]

접근:

  • seats[1][1]은 B2 (세로 인덱스 먼저, 가로 인덱스 다음).[^40]
  • seats[2][4]는 C5.[^40]
  • 인덱스는 0부터 시작한다는 점을 다시 강조.[^40]

줄마다 칸 수가 다른 2차원 배열도 가능(앞줄 3칸, 다음 4칸, 다음 5칸).[^40]

  • 존재하지 않는 좌석에 접근하면 ArrayIndexOutOfBoundsException이 발생함을 A5 접근 시도로 보여준다.[^40]

3차원 배열은 대괄호를 하나 더 붙이면 만들 수 있고(3x3x3 등), 실무에서는 보통 2차원까지가 대부분이라고 언급한다.[^40]

3.15.6 다차원 배열 순회: 중첩 for, 비정형 배열은 각 행의 length 사용[^41]

3x5 seats는:

  • 바깥 for: 세로(행) i < 3
  • 안쪽 for: 가로(열) j < 5
  • 출력: seats[i][j] + " " 형태, 행 끝마다 줄바꿈.[^41]

비정형 seats2(행마다 길이 다름)는:

  • 바깥은 i < seats2.length[^41]
  • 안쪽은 j < seats2[i].length로 “해당 행의 길이”를 써야 오류가 없다.[^41]
    이를 고치기 전에는 j < 5로 고정해서 A4/A5 같은 존재하지 않는 요소 접근으로 예외가 발생하는 것을 보여준다.[^41]

3.15.7 반복문으로 2차원 배열 좌석 자동 생성 + 예약 표시(밑줄)[^41]

10x15 좌석을 수동 입력 대신 코드로 생성:

  • String[][] seats3 = new String[10][15];[^41]
  • 처음에는 A~J 문자 배열을 만들거나, 이후 ASCII를 활용해 문자 증가를 구현한다.[^41]
  • 중첩 for로 seats3[i][j] = english[i] + (j+1) 같은 방식으로 좌석 번호를 채운다.[^41]
  • 출력 순회로 A1~A15 … J1~J15가 찍히는지 확인.[^41]
  • 예매 좌석(H9, H10)을 해당 인덱스(세로 7, 가로 8/9)에 "___" 등으로 바꿔 “이미 판매된 좌석 표시”처럼 보이게 한다.[^41]

3.15.8 ASCII 코드 보충: char의 정수값(대문자 65, 소문자 97, 숫자 48), 문자 증가 활용[^42]

ASCII를 위키 표로 확인하며:

  • 대문자 A는 65, B는 66…; 소문자 a는 97…; 숫자 ‘0’은 48…이라고 설명.[^42]
    코드로:
  • char c='A'; 출력과 (int)c 출력으로 65 확인.[^42]
  • c++하면 다음 문자로 넘어가는 것을 보여준다.[^42]

이를 좌석 생성에 응용:

  • char ch='A';를 두고 행이 바뀔 때 ch++하여 다음 줄 문자로 만들며, String.valueOf(ch)로 문자열화해 seats3[i][j]에 붙여 저장한다.[^42]

3.15.9 퀴즈 5: 신발 사이즈 옵션(250~295, 5단위, 10개) 배열로 출력[^43]

조건:

  • 250부터 295까지 5단위 증가, 총 10개.[^43]
    출력:
    사이즈 250 (재고 있음)사이즈 295 (재고 있음)[^43]

해설:

  • int[] sizeArray = new int[10];[^43]
  • for로 값 채우기: sizeArray[i] = 250 + (5 * i);[^43]
  • 향상 for로 출력: for(int size : sizeArray) System.out.println("사이즈 " + size + " (재고 있음)");[^43]

## 3.16 챕터 6 메소드(Methods): 정의/호출, 파라미터(전달값), 리턴(반환값), 둘 다, 오버로딩, 메소드의 필요성(중복 제거), 변수 스코프, 메인 메소드 args[^44]

3.16.1 메소드 정의/호출: 기능 묶음(함수) 개념, 호출 흐름[^44]

메소드는 “어떤 기능을 하는 코드들의 묶음”이며, 다른 언어의 함수와 유사하다고 설명한다.[^44]
간단한 sayHello() 메소드를 만들고, 메인에서 호출 전/후 출력 사이에 호출하여 “호출 시 메소드로 진입→내부 실행→원래 위치로 복귀” 흐름을 확인한다.[^44]
한 번 정의한 메소드는 여러 번 호출할 수 있음을 sayHello()를 여러 번 호출해 보여준다.[^44]

3.16.2 파라미터(전달값): 제곱(power), 지수승(powerByExponent)[^45]

  • power(int number)는 number^2를 출력(예: 2→4, 3→9).[^45]
  • 여기서 호출 시 넣는 값(2,3)은 인수(argument), 메소드가 받는 변수(number)는 파라미터(parameter)라고 용어도 언급한다.[^45]
  • powerByExponent(int number, int exponent)는 반복문으로 number를 exponent번 곱해 출력한다(2^3=8, 3^3=27, 10^0=1).[^45]

3.16.3 반환값(return): 호텔 정보(전화번호/주소/액티비티) 반환[^46]

void는 반환값이 없다는 의미이며, 반환하려면 반환형(예: String)을 적고 return을 사용한다고 설명한다.[^46]
호텔 예시:

  • getPhoneNumber()"02-1234-5678" 같은 문자열 반환.[^46]
  • 호출부에서 String contactNumber = getPhoneNumber();로 받아 출력.[^46]
  • getAddress(), getActivities()도 같은 방식으로 반환값을 받아 사용하며, 반환값을 변수에 담지 않고 바로 출력문 안에 넣는 것도 가능함을 보여준다.[^46]

3.16.4 전달값+반환값 함께: getPower, getPowerByExp (출력은 호출부에서)[^47]

앞서 파라미터 메소드에서 “메소드 내부에서 출력까지 해버린” 구조를 바꿔, 메소드가 계산 결과를 return하고 메인에서 출력하도록 개선한다.[^47]

  • public static int getPower(int number) → number^2 반환.[^47]
  • public static int getPower(int number, int exponent) → 반복문으로 거듭제곱 결과 반환.[^47]
    호출:
  • retVal = getPower(3); → 9, System.out.println(getPower(2,4)); → 16처럼 사용.[^47]

3.16.5 메소드 오버로딩: 같은 이름, 파라미터 타입/개수로 구분, 반환형은 기준 아님[^48]

오버로딩은 같은 이름의 메소드를 여러 개 만드는 것.[^48]

  • getPower(int)getPower(String)처럼 전달값 타입이 다르면 가능.[^48]
  • getPower(int, int)처럼 전달값 개수가 다르면 같은 이름으로도 가능(기존 getPowerByExp를 getPower로 통일).[^48]
  • 반환형만 다른 것은 오버로딩 조건이 아니라고 명확히 말한다.[^48]

3.16.6 메소드가 필요한 이유: 코드 중복 제거와 유지보수(거듭제곱 반복 코드 리팩토링)[^49]

메소드 없이 2^2, 3^3, 4^2 등을 각각 반복문 코드로 복붙하면 중복이 심하고, 수정이 필요할 때 여러 곳을 찾아 고쳐야 하며 놓치면 오류가 날 수 있다고 설명한다.[^49]
메소드로 추출하면 호출만으로 처리 가능하고, 수정은 메소드 1곳만 하면 되어 유지보수성이 좋아진다고 강조한다.[^49]
또 메소드 안에서 다른 메소드를 호출해(제곱 getPower는 getPower(number,2) 호출로 구현) 중복을 더 줄일 수 있음을 보여준다.[^49]

3.16.7 변수 스코프(범위): 지역변수는 선언된 중괄호 블록 안에서만[^50]

  • 메인에서 선언한 number를 다른 메소드에서 바로 쓰려 하면 오류.[^50]
  • 메소드 B에서 만든 result도 메인이나 메소드 A에서 바로 쓸 수 없음.[^50]
  • for문에서 선언한 i도 for 블록 밖에서 접근 불가.[^50]
  • 중괄호 {} 블록 안에서 선언된 변수는 그 블록 안에서만 유효하며 이를 지역변수라고 설명한다.[^50]
  • 다른 메소드에서 값을 쓰고 싶으면 파라미터로 전달해야 한다는 연결도 한다.[^50]

3.16.8 메인 메소드와 args: 프로그램 실행 시 전달값, IntelliJ 실행 구성, 간단 메뉴 분기 예시[^51]

메인 메소드는 자바 실행 시 가장 먼저 진입하는 메소드이며, String[] args라는 문자열 배열을 전달값으로 받는다고 설명한다.[^51]
IntelliJ에서 Run/Debug Configuration을 편집해 Program arguments에 테스트 전달 값입니다처럼 넣으면 args에 들어오며, for-each로 출력해 확인한다.[^51]

응용 예시:

  • 도서관리 프로그램 가정: 인자 1이면 도서 조회, 2이면 대출, 3이면 반납.[^51]
  • if(args.length == 1)일 때 switch(args[0])로 "1","2","3" 케이스 분기, 그 외 default는 “잘못 입력”. length가 1이 아니면 사용법 안내.[^51]
  • 전달값을 1/2/3/4 또는 1 3(두 개)로 바꿔 실행하며 결과가 어떻게 바뀌는지 확인한다.[^51]

## 3.17 퀴즈 6: 개인정보 비공개 처리 메소드(getHiddenData)로 이름/주민번호/전화번호 마스킹[^52]

문제: 증명서 출력 시 개인정보 일부를 별표로 비공개 처리.[^52]
원본 → 결과:

  • 이름: 나코딩나**(두 번째 글자부터 마스킹)[^52]
  • 주민등록번호: 901231-1234567901231-1******(9번째 글자부터 마스킹: 하이픈 포함 인덱스 기준)[^52]
  • 전화번호: 010-1234-5678010-1234-5***(10번째 글자부터 마스킹)[^52]

조건:

  • 하나의 메소드 getHiddenData(data, index)로 모든 처리를 수행.[^52]
  • 힌트: substring, length 활용.[^52]

주어진 코드 구조:

  • name, id, phone 문자열 변수 선언 후 System.out.println(getHiddenData(name, 1)) 등으로 출력.[^52]

해설 구현:

  • 메소드 시그니처: public static String getHiddenData(String data, int index)[^52]
  • hiddenData = data.substring(0, index)로 앞부분 유지.[^52]
  • 반복문으로 data.length() - index 만큼 "*"를 붙인다.[^52]
  • return hiddenData;로 반환.[^52]
    실행 결과가 예시와 동일하게 나오는 것을 확인한다.[^52]

## 3.18 마무리: 9시간 완강 축하, 다음 단계 안내(클래스/OOP 심화는 풀버전)[^53]

강의는 메소드 퀴즈까지 마친 뒤, 9시간 완강을 축하하며 “자바의 기본 문법을 익혀 간단한 프로그램을 스스로 만들 수 있는 능력을 갖췄다”고 말한다.[^53] 더 깊게(객체지향을 제대로) 배우고 싶은 사람은 인프런 풀코스를 통해 클래스부터 이어서 학습하라고 안내하며, 유튜브에서 다룬 환경설정~메소드 구간은 풀코스와 동일하므로 이후 챕터(클래스부터)로 넘어가면 된다고 정리한다.[^53]


4. 핵심 통찰[^54]

  1. [h 초보 학습의 핵심은 암기가 아니라 “구조화된 복습 가능성”이다.] 파일을 챕터별로 나누고 퀴즈로 직접 구현해보게 한 이유는, 잊어도 다시 찾아 복습하며 내 것으로 만들게 하기 위함이다.[^3]

    • 실행 행동:
      • 각 챕터별 패키지/클래스 구조를 그대로 따라 만들고, “퀴즈는 최소 1회 독자 풀이 후 해설 확인” 루틴을 고정한다.[^3]
  2. [h 개발 환경은 학습/실무의 병목이므로 “정확한 설치 확인(java -version, Hello World 실행)”이 실력의 일부다.] 설치 자체보다 “검증”과 “문제 발생 시 환경변수 점검” 절차가 중요하다고 반복해서 보여준다.[^4]

    • 실행 행동:
      • JDK 설치 후 반드시 java -version 확인, IDE에서 Hello World 실행 확인까지 완료하고 다음으로 넘어간다.[^4]
  3. [h 자바 기초 문법은 결국 ‘데이터(자료형/변수) + 흐름(조건/반복) + 구조화(배열/메소드)’로 수렴한다.] 강의 흐름이 출력→변수→연산→문자열→제어문→배열→메소드로 확장되는 이유가 여기에 있다.[^6]

  4. [h “같은 문제를 더 짧고 유지보수 가능하게” 바꾸는 과정이 곧 프로그래밍 사고다.] 커피 주문(변수 다수→배열), 거듭제곱(복붙 반복→메소드), 영화관 좌석(수동 입력→반복문 초기화)에서 계속 동일한 메시지를 준다.[^38][^49]

  5. [h 인덱스(0부터 시작)와 범위(length)가 실수의 가장 큰 원인이다.] 문자열/배열/다차원배열에서 계속 indexOf, substring, length, ArrayIndexOutOfBoundsException를 통해 “범위를 벗어나면 즉시 오류”를 체감시키며 습관을 만들게 한다.[^21][^40]

  6. [h break/continue는 ‘반복의 흐름 제어’에 대한 감각을 만든다.] 치킨집 예제로 단순 반복이 아니라 “중간 종료(재료 소진)”와 “회차 스킵(노쇼)”를 구현하며 실전형 반복 제어를 익히게 한다.[^35][^36]

  7. [h 메인 메소드 args는 ‘프로그램 실행 시 외부 입력’의 첫 관문이다.] 간단한 메뉴 분기를 통해, 같은 코드라도 입력값에 따라 동작이 달라질 수 있음을 보여주며 이후 입출력/프로그램 설계로 연결되는 발판을 제공한다.[^51]


# 5. 헷갈리는 용어 정리[^55]

  • JDK: 자바 개발/실행에 필요한 도구 묶음(Java Development Kit).[^4]
  • OpenJDK: 무료로 사용할 수 있는 JDK 배포판 계열(강의는 8 중심).[^4]
  • IDE: 통합 개발 환경(코드 작성/실행/디버깅 등을 편하게).[^4]
  • JAVA_HOME / PATH: 자바 실행 파일 위치를 시스템이 찾도록 하는 환경변수(특히 PATH 우선순위 주의).[^4]
  • 패키지(Package): 강의에서는 초반에 “폴더처럼 생각”하라고 안내(소스 코드 조직화 단위).[^6]
  • 메인 메소드(main): 자바 프로그램 실행 시 진입점. String[] args 인자를 받을 수 있음.[^51]
  • 자료형(Data Type): 문자열/정수/실수/불리언 등 값의 형태를 규정.[^8]
  • 형 변환(Type Casting): 타입을 바꾸는 것. 큰 범위→작은 범위는 명시 캐스팅 필요.[^13]
  • 상수(Constant): final로 선언, 값 변경 불가.[^12]
  • 배열(Array): 같은 자료형 값을 연속 공간에 저장, 크기 고정, 인덱스 0부터.[^38]
  • 2차원 배열: 배열의 배열. arr[row][col]처럼 접근.[^40]
  • 오버로딩(Overloading): 같은 메소드 이름을 파라미터 타입/개수로 구분해 여러 개 선언.[^48]
  • 스코프(Scope): 변수가 유효한 범위(중괄호 블록 내부 등).[^50]


참고(콘텐츠 정보)[^56]

  • 제목: 자바 코딩 무료 강의 (기본편) - 9시간 뒤면 여러분도 개발자가 될 수 있어요[^56]
  • 채널: 나도코딩[^56]
  • 길이: 515분 18초[^56]
  • 링크: https://www.youtube.com/watch?v=NQq0dOoEPUM[^56]

[^1]: @[00:22] "이 강의는 자바 기본편입니다" 및 전체 구성 안내. [^2]: @[00:32] 자바 인기 순위/수요, @[02:37] 환경설정~메소드 7챕터 9시간, @[03:10] 클래스/상속/다형성 등 풀버전 20시간 안내, @[04:02] 유튜브 9시간/인프런 20시간 구분. [^3]: @[04:28] 외울 필요 없음, 구글링, 퀴즈의 학습 효과/권장 방식 안내. [^4]: @[06:33] JDK 필요, 오픈JDK 설치(윈도우/맥), 환경변수, IntelliJ 설치 및 프로젝트 생성/실행 확인. [^5]: @[00:44] 자바 활용처, @[04:21] 초보자 대상/실습 중심 구성, @[05:13] 퀴즈 제공 구조. [^6]: @[36:33] IntelliJ 화면 구성 설명, @[38:33] 파일/패키지 구조로 학습 관리, @[41:42] main 작성, @[44:46] println 의미 간단 설명. [^7]: @[00:00]~@[08:35:15] 제공된 전체 트랜스크립트 흐름을 기반으로 순차 재구성. [^8]: @[45:50] 자료형 강의 시작, @[46:48] psvm/main, @[47:46] sout, @[50:46] 문자열/숫자/불리언 구분, @[51:37] 연산 출력. [^9]: @[52:32] 변수 강의 시작, @[54:22] String name 선언/대입, @[57:32] int hour, @[59:36] char, @[01:03:45] float/double 정밀도, @[01:06:39] long 범위/L, @[01:10:38] 컵 크기 비유. [^10]: @[01:11:34] 주석 강의 시작, @[01:14:03] // 주석, @[01:18:21] /* */ 여러 줄, @[01:19:10] 단축키 Ctrl+/, Ctrl+Shift+/. [^11]: @[01:20:44] 변수 네이밍 규칙 6가지, @[01:23:45] 입국신고서 예시, @[01:32:16] 상수 대문자/ final 언급. [^12]: @[01:33:18] 상수 강의 시작, @[01:35:11] final로 변경 불가, @[01:36:48] 상수 대문자+언더스코어 가독성. [^13]: @[01:37:14] 타입 캐스팅 시작, @[01:41:52] 실수→정수 소수점 버림, @[01:48:16] String.valueOf 등 문자열 변환, @[01:54:06] parseInt("Java") 오류 시연. [^14]: @[01:54:36] 퀴즈1 문제, @[01:57:34] 변수 타입 결정, @[02:00:31] 실행 결과 확인. [^15]: @[02:01:30] 연산자 챕터 시작(산술), @[02:05:12] 정수 나눗셈, %[02:06:04] 나머지, @[02:12:31] 증감 연산/전위·후위, @[02:17:36] 은행 대기표 비유. [^16]: @[02:21:09] 대입 연산자/복합 대입 연산자(+= 등) 설명. [^17]: @[02:28:10] 비교 연산자(>,>=,<,<=,==,!=) 설명 및 출력. [^18]: @[02:34:41] 논리 연산자(||,&&,! ) 예시(김치찌개 등), 연속 비교 불가 안내. [^19]: @[02:46:09] 3항 연산자 형식 및 예시(max/min/문자열). [^20]: @[02:52:55] 퀴즈2(키 120cm) 문제 및 해설. [^21]: @[02:58:34] 문자열 챕터 시작, @[03:01:18] length, @[03:02:34] 대소문자 변환, @[03:04:15] contains/indexOf/lastIndexOf, @[03:09:26] startsWith/endsWith. [^22]: @[03:11:00] 문자열 변환( replace/substring/trim/concat ) 실습. [^23]: @[03:22:11] 문자열 비교(equals/equalsIgnoreCase/==, new String 비유) 설명. [^24]: @[03:32:55] 특수문자(\n,\t,\,",' ) 설명 및 예시. [^25]: @[03:44:05] 퀴즈3(주민등록번호 substring) 문제 및 해설. [^26]: @[03:51:36] if 시작, @[03:56:20] 중괄호 필요성 오류 사례, @[03:59:14] &&/! 조건 결합, @[04:03:55] ||로 디카페인 주문. [^27]: @[04:07:15] else 설명 및 커피 예제 확장. [^28]: @[04:14:47] else if(한라봉/망고/오렌지/아메리카노) 예제, else 생략 가능 언급. [^29]: @[04:24:16] switch-case 장학금/등급 가격, break/fall-through, if vs switch 사용처 정리. [^30]: @[04:42:43] for 반복문, 짝수/홀수/역순, 합계 55 예시. [^31]: @[05:01:46] while 반복문, 무한루프 주의. [^32]: @[05:08:14] do-while 최소 1회 실행 차이. [^33]: @[05:15:59] 중첩 반복문 별 사각형/삼각형(좌/우) 구현. [^34]: @[05:33:15] 구구단 이중 반복문 구현. [^35]: @[05:40:10] break(치킨집 20마리) 예시. [^36]: @[05:48:02] continue(노쇼 손님) 예시 및 while에서 증감 주의/while(true) 패턴. [^37]: @[06:00:23] 퀴즈4(주차요금) 문제 및 해설. [^38]: @[06:09:54] 배열 개념(의자 비유), 커피 주문 예시, 선언/초기화 방법, 인덱스 0, 값 변경. [^39]: @[06:25:11] 배열 순회(for/length, 향상 for) 및 비교. [^40]: @[06:34:10] 다차원 배열(영화관 좌석) 생성/접근, 비정형 배열, 인덱스 예외. [^41]: @[06:47:50] 다차원 배열 순회(중첩 for), seats3 자동 생성/예매 표시. [^42]: @[07:04:07] ASCII 코드 설명 및 char/int 변환, 좌석 생성 응용(String.valueOf(ch), ch++). [^43]: @[07:13:07] 퀴즈5(신발 사이즈 배열) 문제 및 해설. [^44]: @[07:19:27] 메소드 챕터 시작, sayHello 정의/호출 흐름. [^45]: @[07:26:02] 파라미터(전달값) power/powerByExponent 메소드. [^46]: @[07:35:42] 반환값(return) 호텔 정보 예시. [^47]: @[07:44:04] 전달값+반환값 메소드(getPower/getPowerByExp) 구현 및 호출. [^48]: @[07:52:48] 메소드 오버로딩(같은 이름, 타입/개수 다름, 반환형은 기준 아님). [^49]: @[08:00:30] 메소드 필요 이유(중복 제거/유지보수) 및 리팩토링, 메소드 내 다른 메소드 호출. [^50]: @[08:08:26] 변수 스코프(지역변수, 블록 범위) 설명. [^51]: @[08:13:38] 메인 메소드 args, IntelliJ 실행 구성, 메뉴 분기 예시. [^52]: @[08:23:04] 퀴즈6(개인정보 마스킹) 문제/조건/주어진 코드/해설 구현. [^53]: @[08:34:20] 완강 축하 및 다음 단계(풀코스/클래스 이후) 안내. [^54]: 강의 전반(특히 @[04:28], @[06:33], @[06:09:54], @[07:20:07])에서 반복되는 학습 철학/구조화 메시지를 기반으로 통찰 재구성. [^55]: 강의에서 반복 등장하는 개념(환경설정, 자료형, 제어문, 배열, 메소드 파트)에서 용어를 추출해 정리. [^56]: 사용자가 제공한 메타데이터(제목/채널/길이/링크).

← 프로젝트에서 보기