개괄

호랑이도 무서워하는 곶감

자바를 시작한 사람에게 무엇이 제일 무서우냐 하면 무조건 'NPE, NullPointerException'이라고 할 것이다.

'혈연, 지연, 학연'보다 무서운 인연이 '악연이다'라는 말이 있듯

그만큼 자바와 null은 뗄레야 뗄 수 없는 존재이면서도 무서운 존재이다.

어쩌면 그 null 하나 때문에도 kotlin이 각광을 받으니...

NPE에 대해선 정말 여러곳에서 수만가지 이야기들을 들었다.

Effective Java의 item54에서는

null이 아닌, 빈 컬렉션이나 배열을 반환하라

라고도 쓰여져 있다. 

세상에 누가 null을 반환하고 싶을까 스럽지만, 때로는 null을 반환해야 할 때도 있고, null을 반환하게 된다면 클라이언트가 추가 방어 코드를 구현해야 한다. 또 클라이언트가 방어코드를 빼먹으면 큰 오류가 발생하게 될 수도 있다.

치즈의 개수를 반환하는 코드가 있다고 해보자.

private final List<Chicken> chickenInStock = ...;
public List<Chicken> getChickens(){
	return chickensInStock.isEmpty()? null : new ArrayList<>(cheesesInStock);
}

치킨의 재고를 반환하는 코드에서 null을 반환하지 말고

public List<Chicken> getChicken(){
	return chickensInStock.isEmpty() ? Collections.emptyList() : new ArrayList<>(chickensInStock);
}

이렇게 빈 Arraylist를 반환하거나,  혹은

public Chicken[] getChickens[]{
	return chickensInStock.toArray(new Chicken[0]);
}

와같은 빈 (혹은 빌 수도 있는) 배열을 반환하는 것이 좋다.

자바8 이후로는 optional.ofNullable로 nullcheck를 보다 유연하게 할수 있지만, optional은 많이 쓰면 가독성이 떨어지는 외에 오류가 많을 수 있다.


왜 이 얘기를 했니?

연산자와 관련된 튜터링을 하면서 튜터님이 말씀해주신

if var==null ? null : 11;

이라는 코드를 보고 갑자기 책에서 본 내용이 생각났다.

이런 코드들이 많이 쓰인다니, 프론트에서도 null checking을 열심히 해야 하나보다.

 

늘 혼자서만 공부하다 보니, 프론트와 소통할 수 있는 일이 한번도 없었고,

이에 늘 여기서 데이터를 정리하든 저기서 데이터를 정리하든 똑같지 않나라는 생각을 했는데,

정말 좋은, 프론트엔드들을 만나고 나니 정말 정보를 잘 정리해서 데이터를 던져야겠다는 생각이 들었다.

'자바' 카테고리의 다른 글

TIL - 좋은 객체지향적 설계원칙, SOLID(3) : LSP  (0) 2023.01.27
TIL - OOP 요약  (0) 2023.01.25
TIL - Math.Random은 정말 난수를 리턴할까?  (0) 2023.01.24
TIL - THE JAVA(2) Flow Chart  (0) 2023.01.20
TIL - THE JAVA(1), JVM  (0) 2023.01.19

많은 수포자들을 열심히 길러냈던 수학적 귀납법

개괄

고등학교때 누구나 수포자를 한 번씩은 꿈꿔봤을 것이다. Dreams come true를 만들어 주는 그 문제...

프로그래밍을 하면서 다시금 한번 마주치게 되었다. 수학과를 갈 줄 알았다면 열심히 해 놓을걸...

플로우차트는 말 그대로 흐름에 관한 차트이며, 비단 알고리즘 문제를 풀 때만이 아니라 추후 설계나 디자인 패턴과도 연관되어 있다.

 

Flowchart

보통 yes는 검은색 화살표로, no는 빈 화살표에 하는 줄 알았는데 상관이 없는 것 같다.

플로우차트는 크게 직선형, 분기형, 반복형으로 나뉘는데 보통 분기형을 많이 사용한다.

직선형이나 반복형만 나타난 것으로는 사실 크게 플로우차트를 그릴 일이 없기 때문이다.

 

오늘의 과제는 https://app.diagrams.net/를 이용한 '이메일/패스워드 검증 플로우차트 그리기'였다.

내가 그린 플로우차트는 다음과 같다. 꽤나 허접하지만, 그래도 처음 플로우차트를 이용해 그림을 그려보았다.

flow차트를 그리니 이런 간단한 문제에서는 필요성을 잘 못 느끼지만, 나중에 의존적인 함수나 패턴이 나올 때에는 굉장히 유용할 것 같다. 다음에는 설계할 때 한번씩 플로우차트를 그려봐야겠다.

'자바' 카테고리의 다른 글

TIL - 좋은 객체지향적 설계원칙, SOLID(3) : LSP  (0) 2023.01.27
TIL - OOP 요약  (0) 2023.01.25
TIL - Math.Random은 정말 난수를 리턴할까?  (0) 2023.01.24
TIL - THE JAVA(3), NPE와 NULL  (1) 2023.01.20
TIL - THE JAVA(1), JVM  (0) 2023.01.19

개괄

IT 인프라 구조라는 책을 읽다가 문득 웹 서버와 AP 서버에 대한 이야기가 나왔다.

웹 서버의 OS 안에는 '프로세스'라는, 독립된 메모리 공간을 가진 것이 있다.

AP서버에도 '스레드'라는 프로세스가 있지만, 웹 서버의 프로세스와는 차이점을 가진다. 바로 AP서버의 스레드는 한 스레드마다 독립적인 메모리 공간을 가지고, 웹 서버의 프로세스는 그 메모리 공간을 같이 공유한다는 것이다.

'JVM도 AP서버의 프로세스중 하나'라고 적혀 있다. 그럼 대체 JVM이 뭘까?

 

자바를 시작하게 되면 늘 듣게 되는 영단어들이 있다. 그 중 3개를 아마 가장 많이 듣게 될텐데,

자바를 설치할 때 듣는 JDK,

자바를 실행할 때 듣는 JRE,

자바 이론을 공부할 때 든는 JVM이 있다.

(물론 내가 들은 것 기준)

JDK 안에 JRE 안에 JVM

JDK는 Java Development Kit, JRE는 Java Run Environment, JVM은 Java Virtual Machine의 줄임말로, 각각 자바 개발 도구, 자바 실행 환경, 자바 가상 기계라는 뜻을 가지고 있다.

 

근본?

코틀린이 자바에서 쓰이던 어플리케이션 목적의 개발에서 조금 더 나은 길을 걷고자 나왔듯,

자바도 결국은 C에서 나온 언어다. 자바는 왜 C에서 branch를 뻗게 되었을까?

C는 "One Source Multi Object Use Anywhere"를 모토로, 하나의 소스파일로 각 기계에 맞는 목적파일로 만들어 어디든 사용 가능하게 하려는 프로그램이다. 그러나 개발자들은 기계에 맞는 목적 파일(OS를 맞춰줘야 하는 파일)들이 아니라, 어떤 OS환경에서도 사용하고 싶어했다.

그래서 C의 위에서 아래로 흐르는 절차지향적 언어에서 탈피해, JAVA라는 객체지향적 언어를 만들었다.

 

자바의 실행

자바는 개발자가 짜놓은 소스파일을 JDK가 제공하는 'java compiler'를 이용하여 실행한다.

JVM의 클래스 로더는 컴파일로 생성된 바이트코드를 전달받아 JVM의 Runtime data area에 로드하고,

JVM의 Execution에 의해 기계어로 해석되어 실행된다.

 

클래스 로더? Execution?

클래스 로더는 자바로 작성한 모든 클래스, 변수등의 정보를 method area에 배치한다.

이 때 변수 중 하나인, static value라고도 불리는 cv가 생성되고 heap area에 배치된다.

 JVM 내부에 바이트 코드를 로드하고, 링크를 통해 배치하는 작업을 수행한다.

 

인터프리터는 바이트 코드를 한 줄씩 읽고 번역해주는데 매우 느리다.

그래서 JIT 컴파일러가 등장했는데, 컴파일러의 특징은 다음과 같다.

 : 바이트 코드 전체를 컴파일하여 캐싱하기 때문에 실행이 매우 빠르고, 미리 오류를 줄여준다.

근데 엑시큐션 얘기하는데 JIT와 인터프리터가 왜 나오냐고? 실행 엔진(Execution)의 실행 방식에 JIT와 인터프리터가 있기 때문이다.

'자바' 카테고리의 다른 글

TIL - 좋은 객체지향적 설계원칙, SOLID(3) : LSP  (0) 2023.01.27
TIL - OOP 요약  (0) 2023.01.25
TIL - Math.Random은 정말 난수를 리턴할까?  (0) 2023.01.24
TIL - THE JAVA(3), NPE와 NULL  (1) 2023.01.20
TIL - THE JAVA(2) Flow Chart  (0) 2023.01.20

+ Recent posts