[JAVA] 널(null) 안전성과 옵셔널(Optional)

2023. 2. 19. 17:06· JAVA
반응형

💋 널(null)

- 값/참조가 없다는 개념

 

💋 널 안전성이 중요한 이유

개발자들이 변수를 사용하기 전에 널 값인지 매번 확인하지는 않는다.

이 경우 NullPointerException, NullReferenceException, Cannot read property of null와 같은 에러가 자주 발생하게 된다.

 

👍 널 안전성

자바, 러스트, C++을 포함한 많은 언어에서 지원하는 기능이다.

기본적으로 모든 값(변수, 매개변수, 리턴값)은 널값을 가질 수 있는데, 이 변수이름 뒤에 ? 기호를 붙이면 널값을 가질 수 있다는 의미이고, 널값 여부를 확인하지 않고서는 사용할 수 없도록 컴파일러가 강제하게 된다.

 

Car? getFifthCar(List<Car> cars) { 
	if (cars.size() < 5) { 
    	return null;
    }
    return cars[4];
}

Car 객체를 담은 리스트에서 다섯 번째 아이템을 가져오는 메서드이다. Car?는 반환값이 널값일 수 있다는 의미이고, 값을 얻기 어려운 경우에는 null값을 반환한다는 의미이다.

 

그래서..? 어떻게 안전하다는건데???

 

getFifthCar() 메서드를 호출하는 곳에서 널의 경우의 수에 대해 처리하지 않으면 컴파일해주지 않는다.

 

public void printResult(List<Car> cars) { 
    Car? fifthCar = getFifthCar(cars);
    if (fifthCar == null) { 
    	System.out.println("다섯번째 없음!");
        return;
    }
    System.out.println(fifthCar);
}

이런 식으로 if문을 통해서 null 값을 검증해주지 않고 여기에서 if문을 지워버리면 컴파일도 안해준다.

 

👍 옵셔널(Optional)

사용중인 언어가 널 안전성을 지원하지 않는다면 옵셔널을 사용할 수 있다.

메서드가 갑자기 널을 반환하면 호출하는 개발자는 상당히 당황할 수 있는데, Optional을 사용하면 반환값이 없을 수도 있다는 것을 다른 개발자도 충분히 인지할 수 있다.

Optional<Car> getFifthCar(List<Car> cars) { 
	if (cars.size() < 5) { 
    	return Optional.empty();
    }
    return Optional.of(cars[4]);
}

위에서 if (fifthCar == null) 이 옵셔널에서는 if (!fifthCar.isPresent())로 대체된다.

public void printResult(List<Car> cars) { 
	Optional<Car> fifthCar = getFifthCar(cars);
    if (fifthCar.isPresent()) {
    	System.out.println(fifthCar.get());
        return;
    }
    System.out.println("없음!");
}

 

암튼 잘 사용해서 null 상황에도 반드시 대처할 수 있게 강제해보자!

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'JAVA' 카테고리의 다른 글

[JAVA] 함수형 프로그래밍: 개념, 스트림에서 부작용 없는 함수를 사용해야 하는 이유, 순수 함수  (20) 2023.03.22
[JAVA] 람다와 스트림(Lambda, Stream)(2): 스트림은 반복문을 대체하기 위해 만들어진 것이 아니다! 스트림의 사용 이유와 방법, 스트림의 생성, 가공(중간연산), 소모(최종연산)  (6) 2023.03.09
[JAVA] 람다와 스트림(Lambda, Stream)(1): 람다는 함수형 인터페이스의 구현체이다?  (5) 2023.03.07
[JAVA] 예외처리(1): 에러 VS 예외, 컴파일 예외 VS 런타임 예외, 헷갈리는 용어 정리(Checked, Unchecked Exception, 검사 예외 등등)  (0) 2023.02.22
[JAVA] 줄바꿈에 대하여: 출력 개행에 \n을 쓰면 안된다고?? System.lineSeparator(), System.getProperty("line.seperator"), String.format() %n  (0) 2023.02.18
'JAVA' 카테고리의 다른 글
  • [JAVA] 람다와 스트림(Lambda, Stream)(2): 스트림은 반복문을 대체하기 위해 만들어진 것이 아니다! 스트림의 사용 이유와 방법, 스트림의 생성, 가공(중간연산), 소모(최종연산)
  • [JAVA] 람다와 스트림(Lambda, Stream)(1): 람다는 함수형 인터페이스의 구현체이다?
  • [JAVA] 예외처리(1): 에러 VS 예외, 컴파일 예외 VS 런타임 예외, 헷갈리는 용어 정리(Checked, Unchecked Exception, 검사 예외 등등)
  • [JAVA] 줄바꿈에 대하여: 출력 개행에 \n을 쓰면 안된다고?? System.lineSeparator(), System.getProperty("line.seperator"), String.format() %n
깃짱
깃짱
연새데학교 컴퓨터과학과 & 우아한테크코스 5기 백엔드 스타라이토 깃짱
반응형
깃짱
깃짱코딩
깃짱
전체
오늘
어제
  • 분류 전체보기
    • About. 깃짱
    • Weekly Momentum
      • 2024
    • PROJECT
      • AIGOYA LABS
      • Stamp Crush
      • Sunny Braille
    • 우아한테크코스5기
    • 회고+후기
    • Computer Science
      • Operating System
      • Computer Architecture
      • Network
      • Data Structure
      • Database
      • Algorithm
      • Automata
      • Data Privacy
      • Graphics
      • ETC
    • WEB
      • HTTP
      • Application
    • C, C++
    • JAVA
    • Spring
      • JPA
      • MVC
    • AI
    • MySQL
    • PostgreSQL
    • DevOps
      • AWS
      • 대규모 시스템 설계
    • frontend
      • HTML+CSS
    • NextJS
    • TEST
    • Industrial Engineering
    • Soft Skill
    • TIL
      • 2023
      • 2024
    • Linux
    • Git
    • IntelliJ
    • ETC
      • 日本語

블로그 메뉴

  • 홈
  • 깃허브

인기 글

최근 글

태그

  • 우아한테크코스5기
  • 우테코5기
  • 예외
  • Composition
  • 함수형프로그래밍
  • 레벨로그
  • TDD
  • 우아한테크코스
  • 컴포지션
  • OOP
  • 람다와스트림
  • Java
  • 스트림
  • lamda
  • Stream
  • 람다
  • 상속
  • 상속과조합
  • 조합
  • 우테코
hELLO · Designed By 정상우.v4.2.0
깃짱
[JAVA] 널(null) 안전성과 옵셔널(Optional)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.