DEV/JAVA

java8 default 메소드, 스태틱 메소드

꿀먹는돼지 2022. 3. 20. 21:16

자바 8 부터는 기본 메소드로 API에 변화가 생겼다. 

 

#디폴트 메서드

인터페이스에서 미리 메서드 내용을 선언할 수 있다.
 
public interface test{
    void printName();
    default void printNameUpperCase(){ // default 메서드는 이렇게 내용을 선언을 할 수 있다. 
        System.out.println(getName().toUpperCase());
    }
    String getName();
}
public class DefaultTest implements test{
    String name;
    @Override
    public void printName(){
        System.out.println(this.name);
    }
    @Override
    public void getName(){ 
        return this.name; 
    }
}
//이렇게 default 메서드인 printNameUpperCase는 선언을 안해주어도 컴파일 에러 없이 넘어갈 수 있다.
//하지만, 주의점이 있다. 미리 구현해둔 getName()이 null 익셉션을 반활할 수도 있기 때문에, 문서화를 잘 두어야 한다.
// getName 구현을 잊지 말 것.
//활용 
public static void main(String[] args){
    Test test = new DefaultTest("name");
    test.printName(); //name
    test.printNameUpperCase(); //Name
}
public class DefaultTest2 implements test{ 
    void printNameUpperCase(); 
}
//상속받는 인터페이스에서 다시 재정의할 수 있다.

//만약에 쓰기 싫다고 하면, 그냥 선언만 하고 안쓸 수도 있다.

 

#같은 default 메서드 명을 가진 인터페이스를 동시에 상속받는다면?
#같은 default 메서드를 가진 인터페이스를 2개 상속받으면, 컴파일 에러가 난다. 어떤걸 상속받는지 모르기 때문
그러면 상속받는 구현체에서 새로 default 메서드를 정의해주면 해결된다.
public class DefalutTest implements DefaultTest, DefaultTest2{
    @Override
    public void printNameUpperCase(){
     //상속받는 구현체에서 새로 default 메서드를 정의해주면 해결된다.
    }
}

#순회 하는 메서드

Spliterator, foreach
- foreach
//example)
List <String> name = new ArrayList<>();
name.add("name1");
name.add("name2");
//데이터가 있다고 가정할 때

name.forEach(System.out::println); //으로 활용할 수 있다.

//실제 구현은
for(String str : name){
	System.out.println(n);
}
- Spliterator (쪼갤수 있는 기능을 가진 iterator)
Spliterator<String> spliterator = name. spliterator();
while(spliterator .tryAdvance(System.out.println));
//이렇게 활용한다.

Spliterator<String> spliterator = name. spliterator();
Spliterator<String> spliterator2 = spliterator.trySplit();
while(spliterator .tryAdvance(System.out.println));
System.out.println("================");
while(spliterator2 .tryAdvance(System.out.println));

//이렇게 하면 데이터가 반쪼개서 나뉘어서 출력되는 것을 볼 수 있다.

stream?

  • count()
element들을 stream 으로 만들어서 functional하게 사용함.
long count = name.stream().map(String::toUpperCase).
filter(s->s.startWith("K"))
.count();
이런식 으로 갯수를 구하거나
 
- collect
 
name.stream().map(String::toUpperCase).
filter(s->s.startWith("K"))
.collect(Collectors.toSet());
이렇게 따로 모아 볼 수도 있다.
  • removeIf
name.removeIf(s-> s.startsWith("k"));
 
  • Comparator 문자열 정렬
name.sort(String::compareTOIgnoreCase);