학습 day1~day10

Hanna·2024년 11월 6일

KOSMO 24.10~25.03

목록 보기
1/12

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를 통해 복제본을 만들수 있다.
  • 같은 타입이라도 서로 다른 객체, 다른 출력값을 얻을 수 있다.
  • 다른 사람들의 주문을 구분할 수 있고, 서로 다른 상태값을 유지한다.

actionPerformed 메소드

  • 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, 예외가 발동하면서 프로그램이 멈춤

    • 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에 다 적지 말고,, 메소드 분할분할~!

actionPerformed 메소드

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
    • 이를 Lombok 라이브러리
  • 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;)
  • 재사용성과 이식성을 높인다 > 동작마다 메소드로 나눈다
    • 한 메소드에는 하나의 동작만 넣자
      ex)
        public String account(int userNumber){ //사용자입력숫자와 랜덤숫자 비교 후 지시
          String result = null;
          if(com < userNumber){
              result = "낮춰라";
          }
          else if(com > userNumber){
              result = "높여라";
          }
          else if(com == userNumber){
              result = "정답";
          }
          return result;
      }
       public void init(){//난수메소드를 호출하는 메소드 >초기화,새게임> 재사용성 높임
          nanSu();
      }
      public void nanSu(){ //랜덤숫자 뽑는 메소드
                  Random rand = new Random();
          // com숫자는 게임이 진행되는 동안 변경되면 안되니까 멤버변수로 함.
          com = rand.nextInt(10);
      }   
  • 생성자에서 채번하는 메소드는 호출하지 않는다 > 재사용성이 떨어진다
    • 생성자 호출시 함수도 호출되는..! 섞여버림 독립성이 떨어진다
  • 사용한 코드는 종료전에 반납, 꺼주자.
 if(sc != null){ 
            sc.close();

배열

int is[] = new int[3];
  • 원시형 타입의 1차 배열 (크기 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이 아닌 생성자로 문제들 풀어보기
  • 생성자 적극활용! (객체 주입: 의존성주입)
profile
computer sight

0개의 댓글