가자미의 개발이야기

자바 Optional 클래스 본문

Java/자바 기본 문법

자바 Optional 클래스

가자미 2021. 2. 9. 10:05

-Optional 클래스를 왜 사용하는가?

--if문을 여러번 써야하는 상황 중 일부를 쉽게 대체할 수 있게 하고자 함.

 

-기본적 활용법

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Optional;
 
public class OptionalPractice {
    public static void main(String[] args) {
        Optional<String> os1 = Optional.of(new String("Toy1"));
        //of는 null인 인스턴스가 올 수 없음
        
        Optional<String> os2 = Optional.ofNullable(new String("Toy2"));
        //ofNullable은 null인 인스턴스가 올 수 있음.
        
        if(os1.isPresent())//존재하는지 확인
            System.out.println(os1.get());
        if(os2.isPresent())
            System.out.println(os2.get());        
    }
}
 
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.Optional;
 
public class OptionalPractice {
    public static void main(String[] args) {
        Optional<String> os1 = Optional.of(new String("Toy1"));
        //of는 null인 인스턴스가 올 수 없음
        
        Optional<String> os2 = Optional.ofNullable(new String("Toy2"));
        //ofNullable은 null인 인스턴스가 올 수 있음.
        
        //ifPresent 만약에 존재한다면 어떤 액션을 취하라
        os1.ifPresent(s-> System.out.println(s));//람다버전.
        os2.ifPresent(System.out::println);//메소드 참조 버전
    }
}
cs

-map메소드 활용

--map 메소드는 람다식을 수행하고 나온 결과물을 Optional 클래스에 감싸서 돌려준다.

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Optional;
 
public class OptionalPractice {
    public static void main(String[] args) {
        Optional<String> os1 = Optional.of("Optional String");
        Optional<String> os2 = os1.map(s->s.toUpperCase());
        System.out.println(os2.get());
        
        Optional<String> os3 = os1.map(s->s.replace(' ''_')).map(s->s.toLowerCase());
        System.out.println(os3.get());
    }
}
cs

-orElse 메소드 활용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.util.Optional;
 
public class OptionalPractice {
    public static void main(String[] args) {
        Optional<String> os1 = Optional.empty();
        Optional<String> os2 = Optional.of("So Basic.");
        
        String s1 = os1.map(s->s.toString()).orElse("empty");
        //orElse는 실행되지 않을 경우 대신 반환.
        
        String s2 = os2.map(s->s.toString()).orElse("empty");
        
        System.out.println(s1);
        System.out.println(s2);
    }
}
cs

 

-FlatMap 메소드 활용

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Optional;
 
public class OptionalPractice {
    public static void main(String[] args) {
        Optional<String> os1 = Optional.of("Optional String");
        Optional<String> os2 = os1.map(s->s.toUpperCase());
        System.out.println(os2.get());
        
        Optional<String> os3 = os1.flatMap(s->Optional.of(s.toLowerCase()));
        System.out.println(os3.get());
    }
}
cs

-Optional 클래스 활용해보기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Optional;
 
public class OptionalPractice {
    Optional<String> phone;    //null 일 수 있음
    Optional<String> adrs;    //null 일 수 있음
        
    public OptionalPractice(Optional<String> ph, Optional<String> ad) {
            phone = ph;
            adrs = ad;
    }
    public Optional<String> getPhone(){
        return phone;
    }
    public Optional<String> getAdrs(){
        return adrs;
    }
    
    public static void main(String[] args) {
        Optional<OptionalPractice> ci = Optional.of(
            new OptionalPractice(Optional.ofNullable(null),Optional.of("Korea")));
        String phone = ci.flatMap(c->c.getPhone()).orElse("no phone number.");
        String addr = ci.flatMap(c->c.getAdrs()).orElse("no address.");
        System.out.println(phone);
        System.out.println(addr);
    }
}
cs