
🔗 Java Docs 👀수시로 들어가서 눈에 익히자.
검색 TIP : 🔎 java api ---
자바의 기본은 객체이다. 자바는
객체 세상이다. 그래서 오히려 자바의 기본 자료형 8개만이 이단아이고 나머지는 레퍼런스 타입이다.main메소드 내에서 동작하는 것만 다루는 단계에서 이제는 객체 세상의 기본인 클래스 만들기에 다다렀다. 그래서 api 문서도 슬슬 봐준다.
tmi 객체를 본격적으로 다룰 때 즈음이면 전에 배웠던 형변환이 더 유용해진다.

✏️ 배열 아니다 클래스(객체)다.
✏️ 배열을 다룰 때 더 편하게 쓰라고 만들어 둔 객체
cf1. static : 객체를 따로 생성하지 않고 쓸 수 있는 것
cf2. scanner: 역시 객체로, utility 패키지 속에 있어 다음과 같이 사용된다.
import java.util.scanner;
따라서 따로 값을 저장하는 필드가 없이 메서드만 있음
값들을 저장하려고 하는 건데 굳이 new로 해서 생성할 필요없는 거임
그래서 다 static 해두고 이용하는 거임
그동안 코딩할 때는 귀찮아서 기능이 있는 것만 알고 활용할 생각을 못했다.
활용 안 하는 게 더 미련했을 수도...
Breakpoint는 디버깅 과정에서 프로그램의 실행을 일시적으로 멈추는 지점이다. 개발자가 특정 코드 줄에 "멈춤 점"을 설정하면, 해당 줄에 도달했을 때 실행이 중단되고 프로그램 상태를 관찰하거나 제어할 수 있다.
public class DebugExample {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) { // Line 1
System.out.println("Iteration: " + i); // Line 2
int square = i * i; // Line 3
System.out.println("Square: " + square); // Line 4
}
System.out.println("Loop finished"); // Line 5
}
}
i = 1, 조건 = true
i = 2, 조건 = true
i = 3, 조건 = true
i = 4, 조건 = false (반복문 종료)
?
Iteration 1: i = 1, square = 1
Iteration 2: i = 2, square = 4
Iteration 3: i = 3, square = 9
?
?
W
코딩꿀팁.
"5번 끝나고 개행시켜주고 싶다" (⁕코드 작성 중)
↳ 그래서 5번 ⁕을 출력하고 나면 속에 있는 반복문도 끝내주면 된다.
😇 조금 없어보이는 정리이지만 나는 항상 사례로 개념을 정리하면 더 기억이 잘 난다.
↳ 라벨
package day03;
// l이 라벨!
public class LabelExam {
public static void main(String[] args){
l: for(int i = 0; i< 3; i++){
for(int k = 0; k < 3; k++){
if( i == 0 && k == 2) break l;
System.out.println(i + ", " + k);
}
}
}
}
중첩반복문에서는 break, continue가 전체 중첩문을 한번에 빠져나올 수 없으므로 라벨 "l"를 사용한다.
라벨에 붙어있는 데까지 빠져나와줘 단순히 블록 단위가 아니라!
↳ for each문
public class Array12 {
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
for(int i : array){
System.out.println(i);
}
}
}
구조
for(값을 넣어줄 변수 :반복되는 자료구조){}
컵 안에 사탕이 들었는데 1번사탕 2번사탕 3번사탕.... 하고 꺼내지 않음. 즉 index로 꺼내지 않음.
"있어? 꺼내 있어? 꺼내" 방식으로 꺼냄 보통! : 이게 더 자연스럽다.
이전에는 iterator / enumeration 이 이러한 기능을 해주었으나 불편. so 더 쉽게 꺼낼 수 있게 만든것 중에 하나가 for each!
우리가 여러개가 들어있는 자료구조에서 꺼낼 때 1번 꺼내 2번 꺼내
포인터 역시 없던 걸 만든 게 아니라
값이 다 정해져 들어올 때: while / 몇번까지 : for
공부 꿀팁: "이게 왜 나왔지" 필요성 측면에서 내용 정리하기
선언
int[] args;(권장), int args[];
생성
약을 담을 약통을 사려고 한다.
🤷🏻♀️ "몇개짜리?"
→ 선언만 하면 담을 공간이 없기 때문에 값을 넣을 수 없다.
공간이 만들어져야 그제서야 값을 넣을 수 있다.
배열의 크기를 지정하여 실제로 메모리를 할당
array = new int[5]; // 크기만 지정
선언+생성
int[] array = new int[5]; // 크기만 지정
int[] array = {1, 2, 3, 4, 5}; // 선언과 동시에 초기화
💡
변수 vs 배열?
배열의 등장 배경에 관해
데이터를 담기 위해 그릇이 필요하고, 이것이
변수라고 앞에서 다뤘었다. 그런데 그릇 하나에 여러 개를 담고 싶을 수가 있다.
이 때 그릇 대신 필요한 게 뭘까? 바로 약통이다. 값이 여러개가 존재할 거고 값을 담으려면 다 변수에 담아야 하는데 그릇이 너무 많아지면 관리하기도 사용하기도 힘들기 때문에 이런 그릇들이 나온 것이다.
➕ 약통이 "10칸"이듯이, 배열을 초기화할 때도 약통 칸을 몇개짜리로 할 건지 정해야 한다.
"정수만 담을 수 있는 5칸짜리 그릇"
배열은 고정길이 자료구조이다.
값을 여러개 담을 수 있는 걸 다 자료구조 라고 함
배열이 중요한 이유는 다른 건 다 객체로 바꿔서 저장하지만 기본 데이터타입 자체를 저장할 수 있다.
변수 하나에는 값을 여러개 담을 수 없기 때문에 변수가 "40개" 필요하다. 이 대신에 배열을 사용할 수 있다.
자바 세상에서는 8개가 특별하고 나머지는 다 참조(레퍼런스) 타입!!
=나머지 애들은 다 주소값만 갖는다
배열은 값을 여러개 갖고 있어야 하니까 주소만 갖고 있는 거
기본형 배열: 기본 데이터타입을 담고 있는 배열
참조형 배열: 나머지 데이터타입을 담고 있는 배열
레퍼런스 타입 사용레퍼런스 타입
String 배열 str[] 만 스택에 저장되고
str[]안의 값은 힙에 저장 -> string을 담은 배열을 가리키는 것
str 이라는 변수(스택)에 힙의 레퍼런스/참조 주소가 들어가고
참조 주소로 접근하는 힙에 배열이 들어있음
메모리상의 주소값: 배열의 첫번째 요소의 그것을 가짐
스택이 가리키고 있는 1차원 배열은 그 속에 들어 있는 배열의 주소를 값으로 가지고 있는 것
그리고 생성된 주소값을 담아주는 것
package day03;
public class ArrayExam02 {
public static void main(String[] args) {
int[][] iarr = new int[3][];
// iarr[0][0] = 10; 아직 이므로 exception 발생
iarr[0] = new int[3];
iarr[0][1] = 10;
// iarr[1], iarr[2]는 아직 안 만들어진 것: 따라서 아직 값 대입 불가
}
}

다른 애들은 객체로 제공이 되자만 배열은 기본 문법에 포함되어 제공됨
~를 가리킬 수 있는 변수
다른 애들은 다 객체로 변해서 들어가지만 배열만 기본 데이터타입 그대로 들어갈 수 있다
"늘 처음처럼"
타입 : "약통에 뭘 넣을거야"cf1. String[] args[]는 2차원이다.
cf2. main 메소드는 1차원 배열만 입력받도록 설계되었다.
언어들은 저마다의 철학이 있는데, 자바의 철학은
나의 속성을, 내 이름을, 외부에서 아무나 알아가는 것이 바람직하지 않다
라는 것이다.
그렇다면 속성값을 이용하고 싶을 때는 어떻게 해야 할까? 갖다 쓸 수 있게 만드는 것이 바로 메소드이다.
"외부에서 속성값 사용할 때 알려주기는 하겠다"
메소드 이름 정하는 규칙 있음
객체도 변수처럼 초기화하고 싶기 때문에 메소드를 사용해 이렇게 할 수 있도록 만든 것이 생성자이다.
e.g.) 대표적 예시: 사람
처음 태어날 때부터 피부색깔 눈 색깔 머리카락 색깔 정해진 채로 태어나듯
생성자는 메소드와 비슷하게 생겼지만 리턴타입이 없음
🤔 생성자의 매소드명= 클래스명 인 이유?
우선, 그냥 약속이다.
객체를 생성할 때는 클래스 이름이 아니라 생성자 이름으로 생성하므로 만일 이름이 다르다면 누구의 객체를 생성하는지 알 수 없을 것이다. 따라서 이름을 같게 설정하여 혼란을 방지한다.
String s = new String(); // String 클래스의 디폴트 생성자를 이용해서 객체를 만들겠다.
String s2 = new String("abc"); // String 클래스의 스트링값을 갖는 생성자
코딩 꿀팁
본인의 안티패턴 정리
"매일 같은 실수 반복"
cf. 알고리즘 테스트 볼때 오히려 중간실력인 사람들이 붙은 이유:
직접 다 구현보다 걸린 시간이 짧앗음
ㅋㅎㅎ..
갖다 쓰자
쫌쫌따리
데이터타입
값 하나 담을 수 있는 공간 비트 이게 8개 있는 게 바이트연산자
"문장이 실행되면 값이 바뀜": 전위연산자
exception 발생하면 프로그램은 종료
따라서 예외처리를 해줘야 그 다음 라인 실행할 수 있도록 코드 짤 수 있다.
바꾸라고 한 네임을 넣어줘
nextInt() : 입력받을 때까지 기다림