DAY1 2024.10.07.월
자바 실습 환경 구축 하기

이미지 붙여넣기 가능
자바가상머신 설치 순서
- oracle jdk21 다운받기
- 실행파일에서 오른쪽 마우스 버튼 클릭한 뒤 관리자권한으로 설치하기
- 물리적인 위치 C:\jdk-21
- java명령과 javac명령의 위치는 bin폴터 아래에 위치함
- 만일 intellij를 사용하지 않는다면
- 컴파일 시
javac D:>workspace_java\basic1\src\day1\variable\Hello.java 경로를 다 적어줘야 함
- 실행시에도 java D:>workspace_java\basic1\out\production\day1\variable\Hello.class
- 따라서 도스명령 프롬프트에서 일일이 작성하여 컴파일&실행은 매우매우 불편
so, intellij 사용
- JVM 설치시 .zip vs .exe
우리는 "exe" 설치 > 시스템 환경파일에 등록됨
java 가상머신에 대한 정보&경로
JVM 물리적 경로가 아닌 상태에서 java 명령어 사용할 수 있음
- <환경 변수 편집>에 javac(컴파일)가 있는 "JAVA_HOME"(C:\jdk-21\bin) 경로 추가 > 서비스 배포를 위해
intellij 에디터
- community 버전 (무료) > JetBrain Toolbox 다운로드
- 개발할 때 사용할 에디터
- 자동완성 기능 좋음 - 디버깅 능력 좋음 - 시각화 도움
- 관리자권한으로 설치
- D: 에 프로젝트 만들기 <workspace_java> 폴더 추가 > 하위 폴더에 여러 프로젝트 추가 예정
Java는 메모리를 2개로 나눠서 사용한다.
- stack 과 heap
- heap에서 클래스class를 로딩함 > 이때 타입을 맞춰주는 것이 중요하다 ex) String, int, System(로컬PC-Window OS)
- 클래스 = 변수 + 메소드로 구성 > 호출하여 사용 가능(호출=사용)
계속 고민 연구 >> 커리어를 쌓아가는 과정 >> 디버깅(오류 찾고 수정하는 것) 능력 향상
[basic1] 폴더
- .idea 폴더는 표준은 x
- src : 고급언어, 인간이 사용, 컴파일 전
- out : 저급언어, 컴퓨터가 알아들을 수 있는 언어, 컴파일 후 (표준 이름은 아님)
src : Hello.java --> out : Hello.class --> 실행
디폴트 패키지인 src에서 바로 클래스 만드는 것은 보안상 권장하지 않음
- src에서 반드시 패키지(폴더) 만들자 + 확장자(java) 설정
코딩 시작
-
클래스 선언 : 대문자('H'ello), 접근제한자(access modifier) 사용 ex) public :누구나 사용가능한 제한자
-
클래스는 변수 & 메소드를 소유
-
실행 : main메소드(main+엔터) - exe파일 만들수 있다. 실행할 수 있다.
-
출력 >> sout + 엔터
-
약자 + 엔터 등 시간, 정확도 효율 높이는 것 많이 사용하자
-
변수의 참조형 타입 : 클래스 선언 대문자/ 주소 번지, 간접 참조 방식
-
변수의 원시형 타입 : 값
public class Hello{}
-
main메소드 원형 - 약속된 표준
-
void : 반환값, 리턴값이 없다. 메소드 호출로 돌려받을 수 있는 값이 없다.
- JVM 소유 클래스 : String, System etc.
변수의 선언과 초기화
- 변수 선언 : 타입 + 변수명; ex) int a;
- 변수 초기화 : 대입연산자 사용 ex) a = 3;
- 메소드 안 선언 변수 : 지역변수 (지변) > 메소드의 {}scope 안에서만 유지&호출
- 지역변수는 반드시 초기화 해야 함 ex)a = 3;
- 클래스 안 선언 변수 : 전역변수 (전변) ( {}scope 범위에서 )
메소드
- 이름 뒤 괄호()가 있음
- 클래스 안의 함수 ex) main(String[] args)
- 호출과 구현 : 세미콜론 ; / 중괄호 {} --> println(); vs main(){}
main메소드 : main(String[] args){}
- main():괄호 안 파라미터 > 변수 선언 (지변) (여기서 초기화(=)는 불가)
- main() {} : 좌우중괄호 안 메소드 선언 (호출x -호출은 끝에 ; 작성)
- String: 타입, []:배열, args:변수 >> 변수 선언 String array
- 배열은 프론트 엔드에서 아주 중요함
프로그래밍
-
입력 받은 값을 처리하고, 그 결과를 출력하는 것
-
입력 : input, parameter / 출력 : println
-
java 문자열 선언 > String 클래스 사용
-
주석 : //한줄 주석, / 여러줄주석 /
-
변수 순서는 1)타입 적고 이름 선언 2)사용(호출)
-
일괄처리를 위해 변수 사용
DAY2 _ 2024.10.08.화
복습
-
변수 선언 : 타입(int, String) + 변수명 ;(세미콜론 - 문장마침표)
-
변수 초기화
1) 타입 작성x, 자바에서는 선언과 초기화 분리 가능;
2) 주의 : 합법적, 불법적인것 구분 > 컴파일 에러, 디버깅 능력 향상 연습
: 허용되는 것과 허용되지 않는 것
: syntax 타입 변수명
: 대입연산자(=) 오른편에 원시형 타입의 값을 왼쪽에 대입 > 부르면 값이 출력
3) 원시형 타입(특정 값) vs 참조형 타입(주소번지 - RAM (stack, heap))
클래스 안에서
- 선언부 - 변수(명사형) 선언, 메소드(동사형) 선언
- 전역변수 > 선언과 초기화 분리 불가 (단, int타입 디폴트값 0 )
- 프로그래밍이란? 입력(변수) > 처리(메소드 : JVM 제공&사용자 정의) > 출력
boolean 타입
- boolean isIDCheck(String mem_id){ return false; }
- 파라미터 한개로 참/거짓 판별 (기초가 아닌 경험 필요)
- 사용 가능한지, 불가한지 >> 코드의 흐름을 바꿔줌
JVM 은 메모리를 2개로 나누어 일한다.

- stack : 지변, 상태값 저장 >> 변하는 값을 저장, 일시적인 저장
인스턴스화
- 객체 생성, 재사용화, 클래스의 전변을 메소드 내에서 사용 원할 때
- 클래스가 heap메모리에 로딩된다.
A3 a3 = new A3();
- A3:클래스(변수의 타입), a3:변수(주소번지(숫자)), new:로딩 예약어, A3():생성자
(괄호가 붙는 것은 2개 : 메소드 & 생성자)
- 메소드 뒤에 세미콜론 > 호출
- 메소드 뒤에 중괄호 > 선언
- 인스턴스변수 a3가 메소드 안의 지역변수
- 호출시 a3.전변(O), a3.지변(X)
- 다른 클래스 사용 원하면 > 해당 클래스 선언시 public 사용할 것
- java.lang패키지 안에 있는 클래스는 JVM이 찾을 수 있음 (import 생략 가능)
- 그러나 그 외 패키지의 클래스는 반드시 패키지이름을 추가해줘야 함
- import 를 이용해서 클래스 밖에서 가져와 줌 ex) import javax.swing.JFrame;
사용자 정의 메소드
int hap(int i, int j){}
- main메소드(실행 메소드)와 구분되는 것
- 파라미터 자리에서 변수 선언 가능 (지역변수)
- 메소드 파라미터(i,j)와 메소드(hap)의 타입을 맞춰서 출력 가능하게 하기 >> 여기선 int, int >> 정수 더하기는 정수
- 지변은 초기화 반드시 필요
- 인스턴스화로 사용될 경우 "값에 의한 호출(call by value)"시 초기화
- return i+j; > 반환
- 파라미터 안에서 열거형 연산자(콤마,)를 이용해서 변수 나열
- 호출시, 파라미터 안에 값이 와야 함
디버그 모드에서
- 줄 번호에 클릭 > 붉은원 : 코드 작동이 그 앞줄까지만 실행됨
- 스텝인투 : 인스턴스화 한 메소드가 어디에 있는지 따라가줌 (JVM 실행 순서)
- 스텝오버 : 한줄씩 코드 실행하도록 함
JVM이 실행하는순서대로 클론코딩 복습 추천 (무지성X) ex) 15-16-9-10-11-17줄
코드 하나하나 꼼꼼하게 분석하고 뜯어보기, 천천히!
파라미터의 활용
- 에러의 종류 : compile에러 > 컴파일 불가 & runtime 에러 > 실행시 에러
- System.out.println(5); >> 클래스.출력.메소드
입력도 되지 않을까? >> Scanner클래스
- 사용자가 값 입력: Scanner(System.in) > scanner.next()
- parseInt()메소드 : String > int로 바꿔줌
- scanner.nextInt메소드 : 아예 처음부터 정수값 입력 받기
- println(문자열 + (정수+정수));
- int + int = int , String + int = String
오늘의 복습
- 인스턴스화 : 클래스 > heap메모리에서 로딩
- 자바가 제공하는 클래스 와 사용자가 정의하는 클래스가 있음(A2.java)
- A2.java 안에 무엇을 쓰나? > main메소드, 자바 제공 클래스 사용 > 인스턴스화 사용
- 변수 재정의, 한번에 하나만 기억할 수 있다.
- 변수 - 배열(같은 타입만 담을 수 있음)
- 예약어 등 이미 정의된 이름으로 변수명을 사용하는 것은 불법
코드의 양은 늘어나더라도 코드의 복잡도는 증가되지 않도록 작성
반복되는 것은 최소한으로 줄이기
day3 2024-10-10-목
복습

- 원시형 타입 변수 : 값을 출력, 소문자 타입(예외 String) ex) int
- 참조형 타입 변수 : 주소번지 출력, 대문자 타입 ex) 클래스
- 인스턴스화(객체화)에서 선언부의 타입과 대입란의 생성자가 다를 수도 있음
- 생성자 : ()괄호 앞에 대문자 (메소드는 소문자)
- RAM - stack << heap
- stack - automatic variable - 일시 저장, 자동으로 비움
- heap - 클래스 로딩 (변수+메소드)
- 인스턴스화 - 클래스 안에 메소드나 변수 호출
- 인스턴스 호출 : a1.hap(1,2); -> 인스턴스변수(주소번지).메소드(or 변수) -> "." 다트연산자로 구분
- 인스턴스로 호출하는 메소드의 파라미터(개수와 타입) 맞춰줄 것
언어니깐, 낯설기 때문에! 익숙해지면 된다~ 운전과 같은 기능의 분야다. - 김승수쌤
객체 지향 언어 JAVA

복습을 어떻게 할까?
- 기본 베이스 있는 사람들 : 프로젝트에 두개의 클래스로 사용하기 - A1, A1main(여기에만 main메소드 넣기) > 컴파일 .class(바이트 코드)
- 처음 : 쌤이랑 같이 해보자~
- 전역변수는 외부의 다른 클래스에서 호출 가능 (재사용성)
- 지역변수는 외부의 다른 클래스에서 호출 불가
Object 클래스와 toString메소드

- 모든 클래스의 아버지 = Object (모든 클래스가 상속받고 있음)
- 클래스를 인스턴스화 하면, 부모 클래스인 Object가 제공하는 toString메소드 사용 가능
- 내가 정의한 클래스 Pride는 Object에 상속된(extends) 관계 Pride < Object
- toString메소드 : 디폴트-주소번지(16진수), 문자열 타입 >> 재정의 가능 *16진수 : 0~9 + A~F
코드 실행 : main메소드 라인부터 실행 < JVM이
User Interface (UI)
- JFrame클래스 사용 --> Window에서 제공되는 소스를 호출
코딩 실습
- 실수형 타입 : float, double
- Casting : i = (int)avg; - 강제로 형(타입) 전환 가능(문자열은X)
- 재사용성 높이는 코드 첫 단계
메소드 중심의 코딩 전개 -- 메소드 선언, 리턴타입의 메소드이름(파라미터){}
- 협업을 하기 때문에 내가 구현한 메소드에 대해 메모 꼭 남기기
메소드 안에 파라미터 : 불필요하다면 비워놔도 됨


main메소드
- 여기에서는 최소한의 코딩 -> 제어 어려움
- 리턴타입과 파라미터를 임의로 변경 불가 > void, (String[] args) 고정
static 붙은 메소드와 변수
- 클래스급의 메소드
- heap메모리에 존재 >> 계속 남아있음. 따라서 웬만하면 사용X
- "공유"를 떠올리기, "하나"(원본)임을 떠올리기
- 어떤 클래스도 공유할 수 있다. >> 다른 클래스의 같은 이름 변수가 같은 값으로 바뀜

- static메소드 안에서는 클래스에서 static이 있는 변수 사용 가능, 없다면 인스턴스화 이용
return
- 사용자 정의 메소드 : int 등의 타입 > return
- void타입 메소드 : main메소드에서 결과 꺼낼 수 없음. 해당 메소드 안에서 sout 써야 출력 가능. >> return X

- print메소드의 파라미터에서 다른 메소드 호출 가능(세미콜론은 X)
day4 2024-10-11-금
복습
- "이름(괄호)"의 형태: 1)메소드 2)생성자 3)Casting연산자: int i=(int)a;
- RAM > stack(지변) & heap(전변)
- Compile issue/error : JVM 문법에 맞지 않는 불법 문제
- chat.GPT가 코드는 다 짜준다. 우리는 보는 눈과 연결해주는 능력 필요
- 학원에서 더럽게 고생해야 회사 가서 그나마 낫지 않겠냐 ㅇㅇ
- .java > .class(byte code:이진법으로 컴파일된 표현)
- public : 하나의 프로젝트(구동 장치, 하나의 프로그램) 안에서 공유 가능
- public 사용 안해도 하나의 패키지 안에서 공유 가능
- 하나의 소스에서는 하나의 클래스만 public으로
- 하나의 .java 안에 main메소드와 사용자정의 메소드의 클래스 분리시, .java 이름은 main메소드의 클래스 이름으로 설정
- public class GMain --> 파일이름 GMain.java
- .class 파일은 두개가 생김
- 혼자 공부할떄도 class를 기본 2개로 나누어 할 것
class에 관심을 많이 가질 것! 어려우니깐
- entry point(진입점): JVM 실행은 main메소드에서 시작
코딩이 먼저가 아니라 말하기가 먼저다. 말로 먼저 설명할 줄 알아야 함.
- 메소드의 파라미터에 참조형도 선언 가능: (클래스타입 변수명)
정적 변수 (static variable)
- static은 클래스 급, 참조형에 가깝다.
- main메소드보다 static블럭이 먼저 작성되면 먼저 호출됨
- static은 변수와 메소드 앞에 올 수 있다.
- 사용예 : "타입(클래스명).변메" ex)Integer.parseInt("2")
- 누구나 공통으로 사용하는 기능에 대해서 여러번 인스턴스화 할 필요가 없을때 사용
- 공유되는 "하나의 원본"만 존재 <-> 인스턴스는 복제 가능
- static 변수는 main에서 인스턴스주소가 달라도 같은 값을 출력함 > 하나로만 존재하기 때문에
- 결과

인스턴스 복제
- 전역변수는 인스턴스 변수에 따라서 서로 다른 값을 초기화 할 수있다.
- 인스턴스화를 3번 하면 H타입의 클래스가 3개 생성됨.
- 3개의 클래스는 heap메모리에 상주한다.

전역변수와 지역변수
- 전역변수 : 고유명사(학번 등) > 클래스 설계, 초기화 생략 가능 > 생성자가 해준다.
- 지역변수 : 초기화 생략 불가, 단, call by value 때 초기화 가능
- 호출할때는 변수만, 타입 작성X

- 인스턴스화 : 선언과 생성

Null Point Exception == 예외

non-static 전변 >> static main 메소드에서
- non-static 메소드: 인스턴스화 필요
- static 메소드(main도 포함): 바로 사용 가능
- non-static 메소에서 non-static 전변 바로 사용 가능
static은 static끼리, non-s은 non-s끼리 바로 사용 가능하다!
main i와 sub i는 500과 100 중 어떤 값을 출력할까?
class Param{
int i;
}
public class TestParam {
void effectParam(Param p) { //참조형 파라미터 삽입 가능
//p = new Param(); ////p 재정의 >> 이것이 있을때와 없을때의 차이는?
p.i = 100;
System.out.println("sub i는 "+p.i);
System.out.println("두번째 p입니다: "+p);
}
public static void main(String[] args) {
TestParam tp = new TestParam();
Param p = new Param();
//위아래 클래스이름 다름 > 타입이 다름
System.out.println("첫번째 p입니다: " + p);
p.i = 500;
tp.effectParam(p); //21번줄 p 주소번지를 넘겨주는 것
System.out.println("main i는 "+p.i);
System.out.println("여기서의 p는 몇번째 주소일까: "+ p);
}
}
- 다른메소드안의 지역변수를 직접 사용은 불가!
- p = new Param();
- 주석되어있을 때 : 원본(얕은복사)을 넘겨 동일한 주소번지의 i이 값이 바뀌어서 main i = 100으로 출력
- 살아있을 때 : (원본이 아닌) 복사본(깊은복사)으로, eff메소드에서 아예 다른 주소번지 p가 생성되어 사용했음. 따라서 main i = 500
--------------------------------------------------------------------------
day5 2024-10-14-월요일
- md 사용법 ; 줄바꿈 - //<br />// 또는 스페이스3번
### 복습
- 전역변수 = member variable 멤버변수(or메소드)
- 원시형 타입 = 기초형 타입 >> stack 메모리에 저장
- 참조형 타입, 로딩(인스턴스화) >> heap 메모리
- NullPointException(NPE) : null-리터럴,참초형의 초기값
- A a = null; > 정의 : a= new A(); > 주소번지 호출
- null로 선언만 한 상태(실체x)에서 a.i; 호출 > 런타임 에러>> NPE, 예외
- 메소드의 파라미터로 참초형도 사용가능 ex)인스턴스 변수
### 복사의 두 종류 : 얕은/깊은
- 얕은 복사 : 인스턴스변수 원본 이용
- 깊은 복사 : 인스턴스화 재정의 - 복사본, 둘로 다르다. (붕어빵 찍어내기...? 붕어빵으로 같게 생겼으나 다른!)
### 정수 자료형 : 8가지
- char < byte < short < int < long < float < double
- 외울 필요x 검색하면 다 나오니깐~^^
- int vs long : 32비트 & 64비트 차이
```java
var x = 1;
int i = 1;
long I = 5L;
float f1 = 3.14f; //f 생략 불가
double d1 = 3.14d; //d는 생략 가능 //f,d,L > 리터럴
byte b1 = 5; //JVM은 int로 자동 형전환 하여 연산함
- 자료형의 크기는 고정, 부호가 있는 자료형만 존재함 (예외, char만 부호x)
- java에는 singed, un-signed가 없음(C언어와 달리)
- 마이너스 붙었는지 따로 확인 코드 필요 ex) if(age<0) return;
- char : 유니코드, 16비트, 자바의 유일한 부호 없는 자료형
- 유니코드의 최대값은 U+FFFF
- 저 값보다 큰 유니코드를 표현하려면 String을 사용(사실상 char 안씀)
- String : 기본 데이터 형이 아님, 정확히 몇 바이트인지 알 수 없음
- 리터럴 / 객체(개체) -> null
- 16진수 리터럴 : 0x로 시작
- 8진수 리터럴 : 0으로 시작
- 2진수 리터럴 : 0b
- float 리터럴 : f,F / double 리터럴 : d,D -보통 생략
- 문자 리터럴: 작은 따옴표 / 문자열 리터럴: 큰 따옴표
- int num = 12345_678 : , 대신 언더바 사용 -> 컴파일 상관없음
. dot 연산자
- 부모클래스Object <- String class 상속
- s1.equals( s2 ): --> 둘의 문자열이 같니?
- equals 소환, : 반환타입-boolean(T/F)
- s1 == s2 --> 둘의 주소번지가 같니?
String클래스
-
heap에 저장되어 있음
-
참조형 중 유일하게 new 없이 객체를 만들 수 있다.
- 즉, 원시형으로 초기화가 가능 ex) String s2 = s1;
-
연속된 문자열을 표현하는 클래스형
-
연속된 문자를 저장하는 메모리를 할당
-
데이터를 처리하는 각종 메소드 지원 ex)equals (Object소유)

-
"s1 == s2" : s1,s2 둘이 주소번지가 같니?
-
"s1.equls(s2);" : s1,s2 둘이 문자열이 같니?
-
23-24번줄
- String타입의 클래스 변수에 문자열을 이어 붙이면 새로운 객체가 만들어진다.
-
s1 호출하든 s1.toString 호출하든 주소번지가 아닌 문자열을 출력함
Java의 String은 immutable(불변객체) : 변경 불가하다~, 원본 고정
heap에 새로운 개체 만들기
- 객체 = 개체 > 요즈음 개체 로 번역하는 경우가 늘어나는 중
- 인스턴스(instance)
- 개체를 부르는 또 다른 표현
- 어떤게 발현한 사건을 인스턴스 라고 함
- 어떤 클래스에 속하는 개체의 한 예
- 인스턴스화(instantiation): 클래스로부터 객체 하나를 만드는 행위
- 개체 만들기
- People scott = new People();
- Human tiger = new Human();
- -People, Human 모두 참조형
- 인스턴스화 > 초기화 > 다시 인스턴스화
- 명시적으로 사용한 자원에 대해 반납처리하는 것 --> 권장함!
- 기존 참조되던 객체는 cadidate상태가 됨 (바로 삭제x-Java는 사용자가 제어 불가)
- 깊은 복사 (변수이름, 타입 같지만 새로운 객체 생성)
day6. 2024-10-15-화요일
복습
- 클래스 안에 정의할 때 : "변수"를 사용하여 정의 --> 적절한 타입을 지정해줘야 한다.
순서, 위치, 초기화가 중요하다~! 특히, 곧 만날 for문 에서~!
디버그 모드를 통해서 과정을 확인하자~! 여긴 회사가 아니다
- 인스턴스를 하고 사용하는 변수가 멤버변수 이다.
- 같은 위치인데 static이 있으면 전역변수이다.
- 리턴타입 : return 뒤에는 아무것도 못쓴다
- 조건문_실행부가 한줄이면 {}중괄호 생략 가능
- Java에서 정수 자료형 8가지를 제외하고는 싹다 주소번지(참조형)임
깊은복사
- 지역메소드에서 각각 new를 통해 복제본을 만들수 있다.
- 같은 타입이라도 서로 다른 객체, 다른 출력값을 얻을 수 있다.
- 다른 사람들의 주문을 구분할 수 있고, 서로 다른 상태값을 유지한다.

- ActionListener(핸들러 클래스)는 이벤트 처리를 담당하는 추상 메소드를 정의하고 있음 like "actionPerformed메소드"
- 추상메소드: 디바이스에 따라서 다르게 구현되어야 하기에 기능을 아직 결정할 수 없다.
- 이벤트 소스: 로그인 버튼 등 사용자의 반응이나 선택
- callback메소드: 개발자가 호출하는 것이 아니다.
- 메인메소드 같은 메소드이다.
puclic class KiwiLogin implements ActionListener
jbtn_login.addActionListener(this);
- 1열의 implements : 이벤트가 발생하면 ActionListener(핸들러 클래스)가 책임지자
- 2열 : 이벤트 소스와 핸들러 클래스를 연결하는 actionPerformed메소드
- 부모 타입은 자손이 가진 메소드를 사용할 수 없음
- 자손 타입은 부모가 가진 메소드를 사용할 수 있음
ActionListener kl = new KiwiLogin();
kl.initDisplay();
생성자
- 디폴트 생성자
- 파라미터가 하나도 없는 생성자 public KiwiTalk() {}
- 선언이 안되어 있으면 JVM이 대신 제공한다.
day7. 2024-10-16-수요일
복습
-
클래스를 볼 때 : 숲 > 나무 볼 줄 아는 시야~!
- 1)인스턴스화 2)this 3)참조형 4)NPE 5)생성자 6)초기화(참조형) 7)위치
-
초기화(null)&재인스턴스화 -> 인터셉트가 일어나면서 지난 자료는 윈도우에게 넘어간다. : candidate 상태가 됨
-
초기화 상태에서 주소번지 호출 -> NPE, 예외가 발동하면서 프로그램이 멈춤
-
생성자
- 클래스 이름을 적음. 반환타입이 없음. 인스턴스화에서 호출
- 디폴트 생성자는 파라미터가 없는 거라서 안적으면 JVM이 대신 처리한다.
-
actionPerformed메소드를 구현하고 있는 클래스를 "이벤트 핸들러 클래스"라고 한다.
코드의 한 부분을 변경했다면 이와 관련된 변수 사용되는 부분을 모두 변경!
SOLID 원칙 5가지
https://velog.io/@haero_kim/SOLID-%EC%9B%90%EC%B9%99-%EC%96%B4%EB%A0%B5%EC%A7%80-%EC%95%8A%EB%8B%A4
this
- 가리키는 것은 자기가 위치해 있는 클래스 주소번지
- 현재 메모리에 활성화되어 상주하고 있는 곳

-결과

- this.멤버변수 --> 원본을 사용하는 것
- cf. 인스턴스화 : 멤버변수 --> 지역변수로 사용

상속
- A is a B 라는 관계
- ex) 소나타는 자동차이다(o), 자동차는 소나타이다(x)
--> 소나타(자손) --상속--> 자동차(부모)

- 상속시, 부모의 메소드를 자손이 다 사용,호출 할 수 있다.
- 코드 양이 줄어든다 (인스턴스화 필요x)
- 이때 "this"를 사용할 수 있다.

if문
- return : 반환이 아니라 중단! 메소드를 통으로 빠져나간다.
- if/else if/esle -> 첫번째 if문에서 조건 만족하면 나머지는 확인하지도 않고 조건문을 빠져나간다.
- if문으로 여러개 나열 >> 하나하나 다 조건문 실행
BorderLayout()
- 창에 동서남북중앙 5개 구역으로 구분하는 것
- 사용자가 클릭 > 이벤트 발생 > JVM이 감지함
메소드 중심의 코딩을 전개하는 연습하기 당부! main에 다 적지 말고,, 메소드 분할분할~!
1) ActionListener를 implements한다.
2) actionPerformed(ActionEvent e) : Override 한다. 호출 & 재정의
public void actionPerformed(ActionEvent e) {
- 파라미터 타입은 고정
- JVM이 감지함 > 기능 실행함으로 call back 메소드 임!!
if(obj instanceof JButton){
System.out.println("너는 JButton 타입입니다. 클래스도 타입입니다)");
}
- instanceof 예약어는 타입을 확인하는 키워드 입니다.
테스트시나리오 따라가보기 : 코드 실행 전 순서, 결과 예상
day8 2024-10-17-목
Classes 본격적으로 배우는 첫날~ day1!
복습
무슨 직업을 가지든지 장기적으로 봤을 때 오랫동안 생각하는 힘이 경쟁력이 있는 능력이다
굳이 연필을 들고 직접 설계도를 그리면서 도식화 해보자
고독하게 연습하자^^
- ; > 호출, : > 반환 타입
- Setter : setXXXX메소드 ex)setTitile() >>> Writer, Setter
- Getter : getXXXX메소드 ex)getText() >>> Reader
- main메소드 : 클래스의 entry point
- 항상 가장 먼저 호출되는 메소드 (단, static{}블록 제외)
- 그래서 main thread라고도 함 (우선권을 가짐)
- 개발자인 내가 직접 호출, 제어 불가능 함 > 그래서 main 코드 줄이자
클래스
- 세 개로 쪼개서 구현하는 것이 가장 좋음
- main / 연산 / Event : 연산 클래스는 재사용성↑
- 두 개 클래스로 쪼개는 것은 대부분 잘 함 -> 3개가 최종 목표
- 이때 NPE를 계속 겪게 됨
생성자
-
파라미터에 따라서 같은이름의 생성자를 여러개 사용할 수 있음(오버로딩)
- 파라미터 개수나 타입이 다를때 다른 생성자로 인지함
- 디폴트 생성자는 파라미터를 생략할 수 있음
- 파라미터 갖는 생성자가 하나라도 있으면 JVM에서 디폴트생성자는 제공X -> so, 직접 디폴트생성자도 같이 선언해야 함
-
Java에서 멤버변수의 초기화를 생략할 수 있는 이유 : 생성자
-
생성자 안에서 메소드 호출 가능
-
반환 타입이 없음(return)
-
생성자 안에서 초기화 작업 가능
- static 블록 사용보다 낫다.

-- setTitle메소드로 하는 일을 생성자의 파라미터에 String을 사용하여 해결 가능
-
고정 메소드 파라미터 이름 바꾸고 싶다면 상위 메소드에 파라미터 선언을 해보자
- boolean isView 로 선언 -> 실행시 initDisplay(true);

상속
- 클래스간의 결합도를 높이는 코드 > 권장하지 않음
- 대신, 인터페이스나 추상클래스 중심의 코드 전개 권장
- 독립적인 코드 작성 권장 > 단위테스트와 통합테스트가 가능하도록
day9 2024-10-18-금요일
복습
- @Override
- @ : 어로테이션
- 부모 클래스 or 인터페이스 or 추상클래스가 정의한 메소드를 재정의하는 경우에 붙임
- 이 경우 선언부를 절대로 훼손하면 안됨
- 콜백메소드나 main메소드 내에서는 보통 인스턴스화를 하지 않음
- addActionListener 발동할 때마다 인스턴스화가 계속 일어나면 메모리 차지 문제가 있음 !!!! XXXX
- java 제공 클래스도 생성자로서 여러 가지로 제공되고 있다
- 파라미터에 따라서 생성자가 구분됨: 파리미터의 타입과 개수
ex) JFrame : (), (String), etc.. (출처: API > INDEX)

무한루프 2개 클래스
- 서로가 서로의 클래스를 호출 >> 무한루프로 서버 터진다^^^

-> 25번줄 : 인스턴수변수 선언 없이 생성부만 작성하여 initDisplay()호출
- 생성자 안에서 호출하는 방법으로 진행해보려고!
Container 클래스
- 화면에 그려진 필요없는 요소 삭제할 때 사용

원하는 버튼 등 배치
- in LoginForm class in src.classes.ui_day9
- 여기서 this 는 JFrame을 가리킴
- JFrame의 디폴트 레이아웃은 BorderLayout: 동서남북중앙
- 따라서 좌표값으로 배치하려면 디폴트레이아웃 파괴 >> null로 초기화하면 됨
0-9 사이 숫자 맞추기 게임
- 클래스가 3개로 분리되었을 떄 this가 꼭 필요하다 --인지!
-인스턴스화와 깊은 관계가 있다.
- 객체생성을 개발자가 한다.(불안)
- 객체생성을 스프링 프레임워크가 제어권을 가져간다. - F/W
this 익숙해지기!!



day10. 2024-10-21-월
학습 목표
- this와 생성자
- 한 메소드엔 하나의 동작만 넣는다
- 변하지 말아야 하는 값은 멤변으로 정의: 멤변과 지변의 배치
작성 폴더
- src.classes.step1.SomeObject.java
- src.classes.step1.A1Main.java
- src.classes.step1.소스공유
- src.classes.day10
- src.classes.day10.quiz.RandomGame > 멤변, 지변을 적절히 배치할 수 있다
로드맵
변수 - 배열(원시/참조) - 객체배열 - LBT(리스트)/Map - 세션과 쿠키
복습
- 복습시 클래스 두개로 나누어서 하기~!
- 두 개의 클래스가 서로 인스턴스화 하면 절대 안됨!! new는 한쪽에만 사용
- 인스턴스 선언, null로 초기화 > 생성자파라미터와 this를 이용해서 원본 넘겨받기 > 생성자 내에서 주소 넘겨받기

- 인스턴스화의 선언, 생성 분리/ 위치와 초기화 익숙해지기
- *매일 조금씩 꾸준히 복습/연습하기 (40분씩이라도~!)
- 문자열 비교: "equals", 주소번지 비교: "=="
- 대입연산자 우측: 좌측보다 작은 타입 - 항상 합법/ 큰 타입-문법에러

- this : static이 있는 메소드에서는 사용이 불가하다
- 멤버변수에 static을 붙이면 전역변수가 된다.
Random Game
- 변하지 말아야 하는 값은 멤변으로 선언
- 랜덤 정답숫자 (초기화시, 정답이 아닌걸로 int com =-1;)
- 재사용성과 이식성을 높인다 > 동작마다 메소드로 나눈다
- 생성자에서 채번하는 메소드는 호출하지 않는다 > 재사용성이 떨어진다
- 생성자 호출시 함수도 호출되는..! 섞여버림 독립성이 떨어진다
- 사용한 코드는 종료전에 반납, 꺼주자.
if(sc != null){
sc.close();
배열
int is[] = new int[3];
int[][] is = new int[2][3];
-
2차 배열: 2행 3열 - 방이 6개
-
new로 배열 선언: 초기화 이전 상태, 디폴트 값을 가짐(0)
-
배열 크기: 선언 후 변경 불가 > 고정형 (다른 언어들과 다르게)
-
같은 타입만 담을 수 있음 > 숫자와 문자열을 같은 로우 불가
- 단, Object 타입으로 선언하면 가능
Object[][] names = new Object[][]{
{1, "John", "Doe", "King"},
{2, "Ward","Tiger", "Scott"},
};
-
ArrayIndexOUtOfBoundsException : 배열 런타임 에러
- 행렬에 각각 어떤것이 들어가는지 잘 확인할 것

- 6열: String배열 디폴트값은 null
- 9열: 선언 및 초기화를 한번에 할 수 있다.
MVC
https://developer.mozilla.org/ko/docs/Glossary/MVC
- Model
- Data + 로직(처리) 담당
- 독립적으로 둬야 함 --> 재사용성↑
- 결합도, 단위/통합 테스트 측면에서 소스 리뷰를 할 줄 알아야 함
- Controller
NoticeMain 코드에 대해서 (메신저 프로젝트 내용)
- 하나(얕은복사,공유)의 화면으로 입력, 상세보기, 수정 등 세가지를 처리해보기
- static이 아닌 생성자로 문제들 풀어보기
- 생성자 적극활용! (객체 주입: 의존성주입)