패스트캠퍼스 데브캠프 : 남궁성의 백엔드 개발 3기

비기너반 강의 복습 4 | 클린코드(메소드, 긍정, 정의), 예외처리, 사용자 만족도, NPE (Null Pointer Exception)와 메모리 영역 구조

Tech_JINI 2025. 1. 24. 12:16

IDE : Integrated development Environment

: 하나의 프로그램에서 구현부터 실행까지 통합한 환경

예. 인텔리제이, 이클립스

 

코딩할 때 줄임말써도 될까? 안될까?

genymdhms() = generateDateTime()

//yyyymmdd

 

📍클린코드

1.     말을 줄이지 않는다.

2.     가독성만 괜찮다면 길어도 상관 X

3.     보편적인 약어는 사용 O ( args, tmp, sys, arr, num … )

4.     주석을 적게 사용

-       주석 사용 이유: 코드를 이해하기 힘들어서

          cf. 패턴(yyyymmdd) 표시할 때, 규칙/법 번호 참고해야할 때

5.     메소드로 추출 ! (extract method)

6.     부정보단 긍정으로 (메소드 이름 설정/반복문 조건) !

 

 

클린코드로 코드 수정해보기

if (date.before(SUMMER_START) || date.after(SUMMER_END))

// 여름이 아니면

          charge = basePrice * WINTER_RATE;

          // 겨울 비용을 내기

else

// 여름이면

          charge = basePrice * SUMMER_RATE + SERVICE_CHARGE;

          //여름 비용을 내라

 

 

내가 메소드를 수정해본 :

String NotSummer() { return date.before(SUMMER_START) || date.after(SUMMER_END); }

 

 

 

메소드 이름 짓는 방법

(1)   foodSelect

(2)   selectFood >> 동사를 먼저 적기

: 메소드는 기능에 대한 내용을 적는 것이기 때문에 동사를 먼저 적는다.

 

 

강사님과 같이 수정한 메서드

If 문은 답이 true 아니면 false이다. => boolen 타입으로 설정

public boolean isNotSummer() {
	return date.before(SUMMER_START) || date.after(SUMMER_END);
}

 

 ----

수정한 메서드를 사용한 코드 

if ( isNotSummer() )
          charge = basePrice * WINTER_RATE;
          // 겨울 비용을 내기

else
// 여름이면
          charge = basePrice * SUMMER_RATE + SERVICE_CHARGE;
          //여름 비용을 내라

>> 주석을 쓰지 않아도 잘 읽힌다.

 

 

긍정문으로 바꾸기 

부정문으로 조건문을 만들면 헷갈릴 수 있다!

최대한 긍정문으로 만들어보자.

 

1.     메서드를 긍정으로

public boolean isSummer() {
	return date.after(SUMMER_START) && date.before(SUMMER_END) ;
}

 

2.     조건문을 긍정으로

if ( isSummer() )
          charge = basePrice * SUMMER_RATE + SERVICE_CHARGE;
          //여름 비용을 내라
else
          charge = basePrice * WINTER_RATE;
          // 겨울 비용을 내기

 

 

 

한글 주석이 깨질 수 있다.

Charge 내용도 메서드화 시키자.

if ( isSummer() )
          charge = getSummerCharge();
else
          charge = getWinerCharge();

 
//----------------------------
 

public boolean isSummer() {
	return date.after(SUMMER_START) && date.before(SUMMER_END) ;
}

Int getSummerCharge() {
    return basePrice * SUMMER_RATE + SERVICE_CHARGE;
}

Int getWinerCharge() {
    return basePrice * WINTER_RATE;
}

 이젠 주석이 없어도, 코드의 의미를 한 눈에 해석할 수 있다.

 


 

변수명 지어보기

'비밀번호를 최근에 바꾼 날짜부터 오늘까지 차이 일 수'의 의미를 가진 변수명을 지어보자

📍앞에 구하려는 것부터 적는다 : days

Int daysSincePasswordChanged;

 

 

로버트 C. 마틴

C++, 자바, 객체지향, SOLID, 클린코드, 디자인 패턴, UML, 애자일 방법론 등을 만들었다.

>> 정답은 없다. 객체지향의 특징을 활용해서 코드를 짜자.

 


클린 코드의 정의

“유지보수하기 쉽게” 코드를 짜는 것

협업이 가능, 잘 알아볼 수 있고, 가독성..

 

+ 성능

+ 안정성, 신뢰성을 확보  

+ 언어의 특징을 살림

 

 

 

+ 성능에 대한 고찰

 인스타 팔로워가 많은 인플루언서가 글을 작성해서, 1억명에서 알림을 보내야 한다. 이 때 어떻게 처리할 것인가?

 

실제로 인플루언서의 글 알림은 긴급알림으로 뜬다.

(그 알림을 다르게 분류(알림을 바로 보내지 않거나 글을 바로 업로드하지 않음)한다는 의미이다.)

 

1. 평소에는 스탠바이 상태를 유지한다.

( 인플루언서가 글을 업로드했다. )

2. 알림을 바로 보내지 않고 대기한다.

3. 대기하는 시간동안 순차적으로 서버를 모두 킨다.

4. 대용량의 서버로 알림을 모두 전송한다.

1억명이 동시에 접속하더라도 문제가 없을 환경을 일정 시간동안 만들고 유지시킨다.

 

+ 안정성, 신뢰성을 확보에 대한 고찰

=> 예외처리로 안정성과 신뢰를 확보한다.

 

(예시) 회원가입페이지에서 숫자를 넣었을 때 아무 반응없이 흰 페이지만 뜬다.

이 경우에 사용자들은 안정적이지 않다고 느끼고 신뢰를 잃을 것이다. 

>> 예외 처리로 개발자들은 이 상황을 예방할 수 있다.

 


예외 처리

예외처리 문법

try – catch, throw, throws => NPE (null pointer exception)

if문도 예외처리를 할 수 있다. If(member==null)

 

면접 질문

안정성을 어떻게 추구하나 -> 예외처리로 안정성 유지

 

 

예외 vs 에러

예외 : 개발자가 놓친 것 (실수나 사용자가 잘못 넣은 것)

에러 : 개발자 탓X (JVM을 사용할 수 없는 경우 등)

 


 

사용자 만족도는 중요하다

개발자 입장에서 어떤걸 지향해야 하는지 고민해보자.

백엔드에서 사용자 경험을 중시하는 개발자란 무엇일까?

 

→ 예외처리를 잘하는 개발자 (서버가 터지지 않게 개발)

→ 성능적으로 고민하는 개발자

→ 기획자의 마인드로 사용자 입장에서 ‘왜?’를 생각하는 개발자

      엘리베이터의 속도를 빠르게 하면 위험해진다. 속도를 빠르게 할 수 없으니 체감속도를 줄일 장치로 엘리베이터에 거울을 넣는다.

 


 

NPE (Null Pointer Exception)

: null을 가지고 있는 객체/변수를 호출할 때 발생하는 에러

 

Null Pointer Exception에서 Pointer는 어떤 의미를 가지고 있을까?

- 그 의미를 이해하려면 메모리 구조를 먼저 알아야 한다!

 

메모리 영역 구조

메모리의 영역은 스택처럼 쌓여있다.

스택 영역 : 상자의 부피는 일정하다. 쌓아서 관리한다.

 

 

모두 쌓아서 관리하는 것은 안정적이지 않기 때문에(String의 값과 int의 값은 무게가 다르다.) 메모리 영역을 나눠서 관리한다.

 

메모리 영역은 '쌓는 곳'과 '더미로 관리하는 곳'이 나눠져 있다.

=> 쌓아서 관리하는 곳: 스택 영역

=> 더미로 관리하는 곳: 힙 영역 (더미에서 찾고 빼기가 쉬움. / 트리처럼 생김. 찾아가기 쉬움.)

메모리 영역을 나누게 되면 발생하는 문제점

- 선택도 해야하고 갔는데 없을 수 있음. 시간이 오래걸리고 비효율적일 수 있다.

 

[ 해결 방법 ]

- 무조건 왼쪽(스택 영역)부터 가라고 시킴.

- 왼쪽엔 값 또는 주소가 담겨 있어, 문제점이 해결된다.

 

 

null pointer 는 주소를 가리켜서 갔는데 null(값이 없음)인 경우를 뜻한다.

Pointer의 의미

 

 

[ 메모리 영역 구조와 널 포인터 요약 ]

메모리는 영역이 두 개로 나뉘어짐. 스택영역/힙 영역

기본 자료형: 스택 영역

String : 힙에 살고 스택에 가리킴

 

객체가 생성되면 어느 영역에 올라갈까-> 힙에 살고 스택에서 가리킴

널 포인터: 스택이 힙을 가르키는데 아무것도 없음