。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-35일차(6월14일)] - 웹프로그래밍 16일차

quarrrter 2023. 6. 14. 17:20

null point exception

게시글 CRUD 추가 

인스턴스 필드와 인스턴스 매서드 활용

의존 객체 주입(dependency Injection. DI


1교시

 

null.getNo() 이면 

null point exception 

주소값이 null 값이면 getNo 실행하지도 않음 들여다보지도 않음. 

 

유효한 인스턴스 주소를 가지고 호출해야함. 안 유효한걸 부르면 null point exception임. 

 

board.setViewCount(board.getViewCount()+1);

조회수 수정하기 

System.out.printf("제목(%s)? >", board.getTitle());

board.setTitle(Prompt.inputString(""));

---

public static String inputString(String title, Object... args) {

System.out.printf(title, args);

return scanner.nextLine();

}

 

public static int inputInt(String title, Object... args) {

return Integer.parseInt(inputString(title, args));

}

로컬변수를 ..로 바꿔라 ,, ? 

유지보수에 좋다 

 

2교시

게시글 CRUD 추가 

APP, MemberHandler, Member, BoardHandler, Board, prompt 나눠서 쓰는거.

 

독서록 CRUD 추가 

BoardHAndler2로 복제해서 사용 

boardhandler와 boardhandler2가 사용하는 같은 board 객체를 사용하기 때문에 번호가 겹침 

근데 의미없음. 네이버 카페 게시글 번호 생각하면 됨. 

 

원본코드를 다른 프로젝트에도 다 복제해서 넣어놨는데  원본코드에서 버그를 발견하게 되면 다른 파일들 다 가서 교정해야함. 

 

새로운 기능을 추가하고 싶을 때 원본에 추가하고 , 복제해서 만든 코드들에도 다 가서 추가해야함. 

 

=> 버그를 교정하거나 기능을 추가하게 되면 복제한 코드에 대해서도 똑같은 작업을 수행해야한다.

=> 코드를 복제하면 할수록 유지보수가 점점 더 힘들어진다. 

=> 기술 부채 //청산하려면 많은 시간, 비용이 필요함 

 

배열을 따로 만들어서 안 겹침 

코드 복제를 하지말고 잉렇게 한 파일을 인스턴스 분리하여 활용하면 좋다. 

 

3교시

## 15. 인스턴스 필드와 인스턴스 매서드 활용

- BoardHandler 클래스에 인스턴스 필드 및 메서드 적용 
- 향후 확장성을 고려하여 MemberHandler 클래스에도 인스턴스 필드와 인스턴스 메서드를 적용한다. 
  - 그래서 실무에서는 대부분의 클래스가 인스턴스 필드와 인스턴스 메서드로 구성된다.

 

메서드가 this를 쓰지 않으면 static으로 하기

 

//4교시

private Scanner scanner;

 

//default constructor 정의

public Prompt() {

scanner = new Scanner(System.in);

}

 

//다른 입력 도구

public Prompt(InputStream in) {

scanner = new Scanner(in);

}

scanner : 

일반 코보드 연결이라면 

입력받은값 리턴. 

네트워크 소켓과 연결되어있다면.

넥스트라인 호출하면 소켓과 연결된 인터넷에 연결된 어떤 원격 컴퓨터에서 받아와서 리턴. 

///

키보드 & 네트워크 소켓: scanner가 사용하는 객체(인스턴스) = 의존 객체 (Denpendency Object)

 

App, MemberHandler, BoardHandler, 와 Prompt

이제 app과 Hanldeler는 prompt가 없음 안됨.

prompt 는 의존 객체임. prompt가 인스턴스 방식으로 변경됨에 따라 이 객체를 사용하는 클래스도 변경해야한다. 

 

 

생성자를 통해 의존객체(prompt)를 주입하는 방식으로. (의존 객체 주입(dependency Injection. DI ) => 어덯게 코드로 작성하는가? => 생성자를 통해 주입. 

주의사항 : injection 

 

오후 수업 

의존객체 주입 

private int length = 0;

static 변수와 인스턴스 변수는 초기화 값이 0이기때문에 값 줄 필요없음. 

private int length;

 

private Member[] members = new Member[MAX_SIZE]; // variable initializer 변수초기화 문장

변수 초기화 문장은 컴파일할 때 생성자(없던 것도 만들어서)에 추가한다. 

1. private satic final int MAX-SIZE : 

(//variable initializer 변수초기화 문장이 => static 블럭으로 이동.

//단 final 변수는 static에서 블럭에서 값을 할당하지 않고 그냥 상수로 취급한다.)

원래 없던 static 생성자가 새로 생기고 그 안에 들어감.(빨간줄)

 

2. private Mmeber() members = new Memeber[MAX_SIZE];

생성자에 삽입됨 (빨간줄)

어디서 초기화하던 ,생성자로 복사되고 주어진건 없어지기 때문에

생성자에 넣어놓고 코드 만들던지, 미리 초기화하든 어디서 하든 의미 없음 

빨간 두 줄 같은 의미임.

생성자의 파라미터는 인스턴스를 제대로 사용하기위해서 이러이러한 값을 주입해야합니다라고 하는것. 

MemberHandler에서 prompt 꼭 받아야한다고 코드짰으니까 

app에서도 파라미터를 통해 memberhandler에 넣어야함