반응형

 

 

 

 

forEach는 throws를 할 수 없다.

static void checkIsOne(int number) throws Exception{
    if (number == 1) {
        throw new Exception("oh no");
    }
    System.out.println(number);
}

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
list.stream().forEach(a -> checkIsOne(a)); // Unhandled Exception 발생!

forEach문 안의 메서드가 예외를 발생시키면,

Unhandled exception: java.lang.Exception 라는 에러 메세지가 출력됩니다.

 

일반 메서드에서 예외가 발생하면 throws를 사용하면 되었는데요,

forEach문에서는 throws 키워드를 적용할 수 없어 난감했습니다.

 

 

하지만 try-catch문으로 간단하게 해결할 수 있었습니다.

 

 

 

 

try-catch 사용!

예외를 처리하는 방법에는 대개 throws와 try-catch를 사용하는 방법이 있습니다.

throws는 상위로 예외를 보내는 것입니다.

 

static void checkIsOne(int number) throws Exception{
    if (number == 1) {
        throw new Exception("oh no");
    }
    System.out.println(number);
}

List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
// Unhandled Exception 해결
list.stream().forEach(a -> {
    try {
        checkIsOne(a);
    } catch (Exception e) {
        System.out.println(e);
    }
});

try-catch문은 예외를 직접 처리합니다.

forEach문 안에 try-catch를 사용하면, Unhandled exception이 사라집니다.

 

 


 

 

간단한 오류를 해결하면서,

throws와 try-catch의 차이에 대해 이해할 수 있었네요.

 

감사합니다.

 

 

 

 

 

 

 

반응형
반응형

 

 

추상이 도대체 뭔 소린지 모르겠는

코린이 && 자린이 &&  비전공자(== 나) 여러분께 바칩니다..

(지적은 언제나 대환영입니다.)

 

 

 

 

 

본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다.

 

1. 인터페이스와 구현체가 무엇인가?  (List와 ArrayList의 차이) (클릭🔗)

2. ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅) (클릭🔗)

3. Set - HashSet, Map - HashMap 의 차이 (클릭🔗)

4. 추상클래스란? -> 본편

 

 

 

 


 

추상이란?

 

위키백과에서는 '추상화'를 아래와 같이 설명합니다.

 

"컴퓨터 과학에서 추상화(abstraction)는 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말한다."

 

이게 바로 이해가 되시나요?

 

뭔가 간추린다는 느낌은 알겠는데,

우리 일상에서 사용하던 추상이라는 단어의 뜻과는 많은 괴리감이 느껴집니다.

 

적어도 저는 그랬습니다.

 

 

이런게 추상화 아닌가요..?

(물론 이 '화'는 그림이고, 그 '화'는 속성의 변화를 의미하기에 다릅니다만.. 발음과 글자가 주는 느낌이라는 것이 있단 말입니다..)

 

 

프로그래밍을 공부하며 많은 부분에서 '추상'이라는 표현을 접했습니다.

객체지향의 추상화, 자바의 추상 클래스, 추상 메서드..

 

그렇게 공부하다가 자연스럽게 '추상'의 뜻을 이해하게 되었고,

위에 적힌 정의를 읽어봐도 어느정도 감이 잡히더라고요.

 

 

저는 '추상'이라는 뜻에 대해

1. 간단하게 설계 또는 간단하게 보여지는

2. '구체적'의 반대

두 가지 해석을 적용하고 싶습니다.

 

 

추상화라는 개념이 매우 중요하지만,

그만큼 넓고 추상적인 개념인 것 같습니다.(닉값 제대로)

따라서 위의 두 가지 해석으로는 많이 부족할 수도 있습니다.

 

하지만 저처럼 도통 이해가 안 돼서 넘어가는 것보다는 낫다고 생각합니다.

이해가 안 되는 초기에는 쉽게 이해하다가, 이해가 쌓일수록 본질적인 뜻을 파악할 수 있으리라 생각합니다.

 

 

아무튼 이런 뜻 풀이를 가지고,

추상 클래스, 추상 메서드가 무엇인지 알아보겠습니다.

 

 

 

 

 

 

 

 

추상 클래스, 추상 메서드

 

추상 클래스는, 추상 메서드를 1개 이상 가지고 있는 클래스를 뜻합니다.

 

그러니 '추상 메서드'를 이해하는 것이 더 중요하겠네요.

추상 메서드의 뜻은 '자식 클래스에서 반드시 오버라이딩해야 하는 메서드'입니다.

 

 

반대 관점에서 보면?

부모 클래스에는 구현되지 않고 선언만 되어 있는 메서드입니다.

자식 클래스에서 오버라이딩을 통해 직접 구현해야만 사용할 수가 있는 것입니다.

 

추상 메서드는 구체적으로 구현이 되어 있지 않습니다.

간단하게 설계만 되어 있으며, 구현은 상속 받은 클래스에서 직접 해야 합니다.

 

 

 

 

 

 

 

인터페이스와 추상 클래스

 

인터페이스는 추상 클래스에 속합니다.

인터페이스의 모든 메서드는 추상 메서드여야하기 때문이죠. (default, static은 예외)

 

따라서 인터페이스는 모든 메서드가 '선언'만 되고 '구현'은 되지 않은 껍데기 입니다.

설계도, 가이드와 같죠.

 

인터페이스를 구현하는 구현 객체는, 인터페이스에서 선언된 모든 추상 메서드를 '구현'해야만 합니다.

 

인터페이스로 규격을 간단하게 설계하고, (비구체적, 추상)

구현 객체에서는 규격에 맞게 메서드를 구현합니다. (구체적)

 

 

 

자바의 ArrayListList의 관계로 설명을 더해보겠습니다.

 

둘의 관계는 아래와 같습니다.

List(인터페이스) ---(구현)---> AbstractList(추상 클래스) ---상속---> ArrayList(클래스)

 

실제로 정의된 코드를 살펴보며

List 인터페이스는 리스트가 갖춰야 할 규격을 간단하게 설계했습니다.

List를 구현한 코드의 일부 - 구현되지 않은 추상 메서드들이 간단하게 설계되어 있다.

 

AbstractList 추상 클래스에서는 그중 일부를 구체적으로 구현했고, 일부는 추상적으로 남겨둡니다.

AbstractList를 구현한 코드의 일부 - add는 구현되었고, get은 추상 메서드로 남아 있다.

 

ArrayList 클래스에서는 모든 추상 메서드를 구체적으로 구현하고, 일부 메서드는 오버라이딩합니다.

ArrayList를 구현한 코드의 일부 - 추상 메서드로 남아 있던 get을 구현했다.

 

 

이것이 추상 클래스, 추상 메서드가 실제로 활용되는 방식입니다.

 

 

 

 


 

 

본 아티클을 통해 추상 클래스, 추상 메서드에 대한 이해가 더해지길 바랍니다.

또, 저처럼 추상의 뜻이 도통 이해되지 않던 자린이, 코린이도 추상의 개념을 조금은 이해해가길 기원합니다.

 

잘못된 부분이 있다면 단호한 지적 부탁드립니다.

감사합니다!!

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

(지적은 언제나 대환영입니다.)

 

 

본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다.

 

1. 인터페이스와 구현체가 무엇인가?  (List와 ArrayList의 차이) (클릭🔗)

2. ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅) (클릭🔗)

3. Set - HashSet, Map - HashMap 의 차이  -> 본편

4. 추상클래스란? (클릭🔗)

 

 

 

 


Set과 HashSet, Map과 HashMap의 차이

 

Set<String> set = new HashSet<>();
Map<String, Integer> map = new HashMap<>();

위와 같은 코드를 자주 보셨을 거라 생각합니다.

 

여기서 한 가지 의문이 듭니다.

HashSet 객체를 Set으로 선언하는 거지?

HashMap 객체를 Map으로 선언하는 거지?

 

 

여기서 SetMap인터페이스입니다.

인터페이스는 실제로 구현되지 않은 추상메서드만 가지고 있습니다.

 

하지만 HashSetHashMap은 해당 인터페이스들을 구현(implements)한 클래스입니다.

이러한 클래스를 해당 인터페이스의 구현체, 구현 객체 라고 합니다.

 

 

비유하자면,

인터페이스는 Set(집합)으로서 갖춰야 할 규격, 지켜야 할 가이드와 같은 개념입니다.

HashSet은 그 규격에 맞춰 실제로 설계된 물건입니다.

 

 

(아래에서는 편의를 위해 Set만 언급하겠습니다. Map으로 치환해도 내용은 동일합니다.)

 

위와 같이 set 변수를 Set으로 선언하면,

Set 인터페이스에 선언된 메서드를 사용할 수 있습니다.

그리고 그 동작은 HashSet에서 구현된 로직을 통해 이루어집니다.

 

 

그런데, Set 인터페이스에는 없지만

HashSet에는 구현되어 있는 메서드가 있을 수도 있습니다.

 

그리고 Set 타입인 set 인스턴스는 그 메서드를 사용할 수 없습니다.

 

 

그럼에도 불구하고 setSet 타입으로 선언하는 이유가 무엇일까요?

아래에서 그 이유를 다뤄보겠습니다.

 

 

 

 

HashSet, HashMap이 아닌 Set, Map으로 선언하는 이유

 

바로 다형성 때문입니다.

 

다형성은 하나의 객체에 여러 가지 타입을 적용할 수 있는 것입니다.

 

사실 HashSet을 많이 사용하지만,

Set 인터페이스의 구현체에는 TreeSet, LinkedHashSet 등도 있습니다.

(당연히 아실 수도 있지만, 저는 몰랐습니다..)

 

Set<String> set = new HashSet<>();


public int getFirstValueOfSet(Set<String> set) {
	return set.어쩌구();
}

만약 위와 같이 구현된 코드에서,

HashSet이 아닌 TreeSet을 사용하고 싶다고 해봅시다.

 

그럼 아래와 같이 HashSetTreeSet으로 수정하면 됩니다.

Set<String> set = new TreeSet<>();


public int getFirstValueOfSet(Set<String> set) {
	return set.어쩌구();
}

 

 

하지만 아래 set 객체가 Set이 아닌 HashSet으로 선언되었다면?

HashSet<String> set = new TreeSet<>(); // 컴파일 에러 발생


public int getFirstValueOfSet(HashSet<String> set) {
	return set.어쩌구();
}

컴파일 에러가 발생합니다.

 

게다가 수정을 위해서는 HashSet을 전부 TreeSet으로 바꿔줘야 합니다.

TreeSet<String> set = new TreeSet<>(); // 변경 과정이 복잡하다


public int getFirstValueOfSet(TreeSet<String> set) {
	return set.어쩌구();
}

 

코드가 복잡할수록 이러한 문제도 더욱 심각해집니다.

 

 

그렇기에 setSet으로 선언하고,

인자로 받을 때도 Set 타입으로 받는 것이죠.

이렇게 상위 개념으로 선언하고, 하위 개념을 생성해 할당하는 것을

업캐스팅(Up-casting)이라고 합니다.

(반대로 업캐스팅된 객체를 하위 개념 타입으로 변환하는 것은 다운캐스팅입니다.)

 

 

이는 객체지향의 SOLID 원칙D(Dependence Inversion Priciple : 의존 관계 역전 원칙)와도 연관이 깊은 내용입니다.

관련한 내용은 깊고 중요해, 따로 찾아보시는 것을 추천드립니다.

 

 

 

 


 

 

 

본 편에서는 1, 2편의 내용을 Set과 Map에도 적용해보았습니다.

 

1, 2편을 읽지 않아도 대략적인 이해가 되리라 생각합니다만

이해가 어렵거나 보다 더 이해하고 싶으시다면,

1, 2편을 차례로 읽어보시길 추천드립니다.

 

1편 - 인터페이스와 구현체가 무엇인가?  (List와 ArrayList의 차이) (클릭🔗)

2편 - ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅) (클릭🔗)

 

 

 

 

마지막 4편에서는 추상클래스에 대해 가볍게 다뤄보겠습니다.

https://woojin.tistory.com/64

 

추상클래스란? 아니, 추상이란? - 무조건 이해되는 List와 ArrayList의 차이(4)

추상이 도대체 뭔 소린지 모르겠는 코린이 && 자린이 && 비전공자(== 나) 여러분께 바칩니다.. (지적은 언제나 대환영입니다.) 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다. 1.

woojin.tistory.com

 

이 '추상', '추상화'라는 개념이 프로그래밍에서 쓰이는 것와 일상에서 쓰이는 뜻이 너무 달라 저에게는 너무 어렵게 느껴졌습니다.

관련해서 느꼈던 점과 이해한 방식을 소개해보고자 합니다.

 

 

 

 

감사합니다!

 

 

 

 

 

 

 

 

반응형
반응형

 

 

10분만 이 글에 투자해주시면

ArrayList를 List로 선언하는 이유를 이해시켜드리겠습니다..

(지적은 언제나 대환영입니다.)

본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다.

 

1. 인터페이스와 구현체가 무엇인가?  (List와 ArrayList의 차이) (클릭🔗)

2. ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅)  -> 본편

3. Set - HashSet, Map - HashMap 의 차이 (클릭🔗)

4. 추상클래스란? (클릭🔗)

 

 

 

 


ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅)

 

1편에서는 ListArrayList가 무슨 차이인지,

인터페이스와 구현체의 개념와 그 차이에 대해서 살펴보았습니다.

(해당 내용을 모르겠다면 클릭🔗)

 

 

List<String> stringList = new ArrayList<>();	// 1번
ArrayList<String> stringList = new ArrayList<>();	// 2번

이제 위 구문을 살펴보겠습니다.

 

 

stringList 변수는 ArrayList 구현체로 생성되었습니다.

ArrayList 클래스 구현 코드를 살펴보면, 아무 인자가 없을 때 작동하는 생성자가 존재할 것이고,

그것에 따라 ArrayList 객체를 생성했고, stringList에 할당시켰을 것입니다.

 

그런데, 어차피 ArrayList를 생성해서 사용할 것이라면

ArrayLIst 타입으로 선언하면 되지 않을까요? (1번)

굳이 List로 선언할 이유가 있을까요?? (2번)

 

하지만 2번을 사용하는 것이 널리 알려져 있습니다.

그 이유에 대해서 살펴봅시다.

 

 

Yo DJ~ spin that shxx~

 

 

 

 

1. List의 메서드는 문제 없이 사용 가능하다!

우선, List로 선언한 변수에 ArrayList를 구현체를 생성해 할당하면

List 안에 선언된 추상 메서드들을 ArrayList가 구현한 방식대로 사용할 수 있습니다.

 

이해를 돕기 위해 예시를 들겠습니다.

 

Listadd, size 라는 추상 메서드가 선언이 되었다고 가정하겠습니다.

그리고 ArrayListadd, size라는 메서드가 구현이 되었고,

추가로 addSize라는 메서드도 새로 구현이 되었다고 하겠습니다.

 

그럼 List 타입으로 선언된 stringListaddsize라는 메서드를 사용할 수 있습니다.

그리고 그것을 사용하면, ArrayList에서 구현한 방식대로 동작합니다.

 

하지만 여기서 문제가 발생하는데,

List에는 addSize라는 메서드가 선언되지 않았기 때문에,

stringListArrayListaddSize 메서드를 사용할 수 없습니다.

 

그렇지만, 대개 ArrayList에서 새로 선언한 메서드는 잘 사용되지 않고,

List 인터페이스에 선언된 메서드만으로 충분하기 때문에 큰 문제가 없다고 합니다!

 

 

 

 

2. (중요!) 다형성 부여 (+ 의존 관계 역전 원칙)

다형성이란 '하나의 객체가 여러 가지 타입을 가지는 것'을 의미합니다.

 

List<String> stringList = new ArrayList<>();


public int getFirstValueOfList(List stringList) {
	return stringList.어쩌구();
}

위 코드를 살펴보겠습니다.

stringListList 타입이지만, ArrayList로 구현되었습니다.

그런데, 자료의 추가, 삭제를 빠르게 하려고 LinkedList를 사용하고 싶어진다면 어떡할까요?

 

// List<String> stringList = new ArrayList<>();
List<String> stringList = new LinkedList<>();


public int getFirstValueOfList(List stringList) {
	return stringList.어쩌구();
}

구현체만 ArrayList에서 LinkedList로 변경해주면 끝입니다.

 

 

하지만, stringList의 타입이 List가 아닌 ArrayList였다면??

// List<String> stringList = new ArrayList<>();
ArrayList<String> stringList = new LinkedList<>(); // 컴파일 에러 발생


public int getFirstValueOfList(ArrayList stringList) {
	return stringList.어쩌구();
}

ArrayList 타입에는 LinkedList 구현체를 할당할 수 없어서 컴파일 에러가 발생합니다.

 

 

위와 같은 코드를 구현했다면,

코드에 보이는 ArrayList를 모두 LinkedList로 수정해야 합니다.

// List<String> stringList = new ArrayList<>();
LinkedList<String> stringList = new LinkedList<>();


public int getFirstValueOfList(LinkedList stringList) {
	return stringList.어쩌구();
}

 

코드가 복잡할수록 이 문제는 심각해집니다.

 

 

따라서 stringListList로 선언하고,

인자로 받을 때도 List로 받는 것입니다.

 

후에 stringList의 구현체가 변경되어도,

stringList와 관련한 메서드들을 수정할 필요가 없어지기 때문이죠.

 

이렇게 상위 개념으로 선언하고, 하위 개념을 생성해 할당하는 것을

업캐스팅(Up-casting)이라고 합니다.

 

(반대로 업캐스팅된 객체를 하위 개념 타입으로 변환하는 것은 다운캐스팅(Down-casting)이라고합니다.)

 

 

 

+ 추가내용)

이는 객체지향 SOLID 원칙D에 해당하는

의존 관계 역전 원칙(DIP : Dependency Inversion Principle)과도 연관이 있습니다.

 

저 원칙은 뜻이 되게 어려운데 (저에게는..)

저수준 모듈이 아닌 고수준 모듈에 의존해야 한다는 뜻을 가지고 있습니다.

 

즉, ArrayList가 아니라 List에 의존해야

다형성을 가질 수 있고, 다른 원칙을 위반하지 않을 수 있다는 것이죠.

관련 내용은 복잡하지만 중요해서, 추가로 찾아보기를 추천드립니다.

 

 

 


 

다음 아티클에서는

SetHashSet, MapHashMap의 차이에 대해서 다뤄보았습니다.

https://woojin.tistory.com/63

 

Set과 HashSet, Map과 HashMap의 차이 - 무조건 이해되는 List와 ArrayList의 차이(3)

(지적은 언제나 대환영입니다.) 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다. 1. 인터페이스와 구현체가 무엇인가? (List와 ArrayList의 차이) (클릭🔗) 2. ArrayList가 아닌 List 타

woojin.tistory.com

 

1, 2편 내용으로 충분히 이해되었을 내용이지만,

복습이 필요하시다면 읽어봐주세요.

 

감사합니다!

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

10분만 이 글에 투자해주시면

List, ArrayList, 인터페이스, 구현체 이해시켜드리겠습니다..
(지적은 언제나 대환영입니다.)

본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있습니다.

 

1. 인터페이스와 구현체가 무엇인가?  (List와 ArrayList의 차이) -> 본편

2. ArrayList가 아닌 List 타입으로 선언하는 이유 (업캐스팅) (클릭🔗)

3. Set - HashSet, Map - HashMap 의 차이 (클릭🔗)

4. 추상클래스란? (클릭🔗)

 

 

 

 

 


List<String> stringList = new ArrayList<>();

위 코드를 처음 보고 이런 생각이 들었습니다.

ArrayList<String> stringList = new ArrayList<>();

이렇게 바꿔야하는 거 아닌가?

 

어차피 ArrayList를 사용할 건데, 왜 타입은 List로 지정하는 거지?

이렇게 생긴 의문은 ListArrayList의 차이, List는 뭐였더라.. 등등 겉잡을 수 없는 의문 폭탄에 불을 붙였습니다.

 

 

 

누구에게는 상당히 쉬운 주제일 수 있겠으나,

자바 문법을 가볍고 빠르게 공부한 저에게는

전혀 이해가 되지 않는 문제였습니다.

 

하지만 이번 공부를 통해 인터페이스와 구현체에 관한 개념은 완벽하게 이해했다고 자부합니다.

관련해서 찾아보고 이해한 내용을 공유하고자 합니다.

 

 

 

 

 

 

Trust me, Follow me. ㅋㅋ

 

 

 


 

인터페이스(List)와 구현체(ArrayList)

 

List인터페이스이고, ArrayList클래스입니다.

그 차이를 알기 위해, 정의된 곳으로 가서 살펴볼 필요가 있습니다.

 

IntelliJ(또는 Eclipse)에서 Listimport한 후

List에 커서를 가져다 대고 cmd+B(ctrl+B)를 클릭하면, (또는 cmd + 마우스 좌클릭)

해당 클래스가 정의된 곳으로 이동합니다.

 

Let's go together~

List가 정의된 곳으로 가보자
List가 구현된 부분! interface로 선언되었음을 알 수 있다.
ArrayList가 구현된 부분..?

어라.. ArrayList는 이상하다..! 왜 두 번 구현되어 있지..? (사실 두 번보다 더 많다.)

게다가 classinterface로도 선언되지 않았습니다.

 

왜냐면, 해당 부분은 생성자를 구현한 부분이기 때문입니다.

위로 올라가면 ArrayList의 선언이 나옵니다.

ArrayListAbstractList를 상속받은 클래스입니다. AbstractList도 들어가봅시다.

 

implements List !!

그렇습니다.

결국 ArrayLisstList라는 인터페이스를 구현(implements)한 클래스입니다.

(중간을 매개하는 AbstractList 클래스는 맨 뒤 4번에서 다루겠으니, 잠시 잊어둡시다.)

 

여기서, 클래스(class)와 인터페이스(interface)의 차이를 짚고 넘어가겠습니다.

(필자는 둘의 차이를 정확히 알지 못했습니다.)

 

 

클래스(class) vs 인터페이스(interface)

클래스와 인터페이스는 모두 내부에 메서드를 가집니다.

하지만 클래스는 메서드의 body가 존재해서 그 내용이 구현된 반면,

인터페이스는 body가 존재하지 않습니다! (default, static 메서드는 예외)

 

여기까지는 필자도 이미 알고 있었지만, 왜 그렇게 되어 있는지는 몰랐습니다.

 

List 인터페이스 내부의 size 메서드 -> 설명만 주석으로 달려 있고, 구현이 안 되어 있다.
ArrayList 클래스 내부의 add 메서드 -> 구현이 되어 있다!

 

 

그것은 인터페이스와 클래스의 역할이 다르기 때문입니다.

 

아래에서는 List 인터페이스가 add, size 메서드 2개만 가지고 있다고 단순하게 가정하겠습니다.

 

List 인터페이스는 List가 갖춰야 할 기본 규격을 뜻합니다.

"List라고 하면, 자고로 add, size 메서드 정도는 있어야 해" 라고 알려주는 가이드와도 같습니다.

여기서, List안에 존재하는 add, size 메서드는 추상 메서드 라고 합니다.

구체적으로 기능이 구현된 메서드가 아니라, 그 존재만 추상적으로 선언된 것입니다.

 

ArrayListList 인터페이스를 구현(implements)한 클래스입니다.

List라는 규격에 따라, 실제로 add, size를 구현해서 사용하게끔 만들어졌다는 뜻입니다.

 

ArrayList 뿐만 아니라 LinkedList, VectorList 인터페이스 규격에 맞게 설계된 많은 클래스들이 존재합니다.

이런 클래스들을 LIst의 구현 객체 또는 구현체 라고 부릅니다.

 

ArrayList는 그중 배열의 성질을 활용하기 위해 만들어진 하나의 구현체일 뿐인 것이죠.

 

 

이렇게 우리는

인터페이스(List)와 구현체(ArrayList, 클래스)의 뜻을 이해했고,

List ArrayList가 어떤 차이를 가지는 지도 파악했습니다.

 

 

List<String> stringList = new ArrayList<>();

그렇다면, 정말 많이 볼 수 있는 위 구문에서

stringList 변수는 List로 선언되고 ArrayList로 생성된 이유는 무엇일까요?

 

 

 

다음 아티클에서 설명드리겠습니다!! (링크 👇)

https://woojin.tistory.com/62

 

ArrayList를 List로 선언하는 이유(업캐스팅) - 무조건 이해되는 List와 ArrayList의 차이(2)

10분만 이 글에 투자해주세요. ArrayList를 List로 선언하는 이유를 이해시켜드리겠습니다. 본 아티클 시리즈를 정독하면, 아래 의문에 답을 얻을 수 있다. 1. 인터페이스와 구현체가 무엇인가? (List

woojin.tistory.com

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

에러 전문

Oct 28, 2022 8:15:45 PM org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReasons$7
INFO: 0 containers and 10 tests were Method or class mismatch

 

 

에러 상황

- 테스트 코드 중 특정 클래스만 실행할 때 발생했다.

 

 

에러 이유

작성된 테스트 코드 중 특정 클래스만 실행했다는 경고문이다.

실제로 실행시킨 테스트 코드는 잘 실행되었으며, 전체 테스트 코드 실행 시 해당 경고문이 발생하지 않았다.

테스트에는 아무 문제가 없었다.

 

또한, 빌드할 때 JUnit으로 테스트가 진행 되어야 하는데 Gradle로 되어서 발생하는 것이라고 한다.

Gradle 에서 Intellij IDEA로 변경하면 해당 경고문이 발생하지 않는다.

 

mac기준, 아래와 같이 IntelliJ 설정을 변경하면 된다.

 

 

 

 

참고 링크 : https://stackoverflow.com/questions/68465659/what-causes-a-junit-warning-org-junit-platform-launcher-core-enginediscoveryorch

 

What causes a junit warning org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorExclusionReason

I have a gradle-based java testing framework. After updating junit to 5.7.2 this warning started appearing for every test: Jul 21, 2021 10:23:45 AM org.junit.platform.launcher.core.

stackoverflow.com

https://www.inflearn.com/questions/157200

 

질문하나만 드려도될까요.. - 인프런 | 질문 & 답변

테스트는 성공으로 뜨는데  빨간색으로 이런 글씨가 있어서 왜 이런게 뜨는지 여쭤봐도 될까요..?  org.junit.platform.launcher.core.EngineDiscoveryOrchestrator lambda$logTestDescriptorEx...

www.inflearn.com

 

반응형
반응형

Java IDE인 IntelliJ에서 JDK 버전을 바꾸는 방법을 정리해보고자 한다.

* m1 프로세서(arm)을 사용하는 macOS 버전입니다.

 

대략 아래와 같은 순서로 진행된다.

1. IntelliJ에서 JDK 버전 바꾸기

2. 원하는 버전이 없다면 다운로드

3. 터미널에서 환경변수 설정하기.

 

가끔 한 프로젝트는 8 버전을, 한 프로젝트는 11 버전을 사용해야하는 분들이 있는데,

위의 1번과 3번을 계속 왔다리갔다리 설정하면 된다.

(IntelliJ 설정 변경 + 환경변수 변경)

 

 

 


1. IntelliJ JDK 버전 바꾸기

IntelliJ 좌측 상단 메뉴바 - File - Project Structure - SDK

이 곳에서 원하는 버전을 설정하면 되는데, 없다면 아래 2번으로 가서 설치 후 설정을 변경해야 한다.

 

 

* Language level이란? (참고 링크: https://atoz-develop.tistory.com/entry/JAVA-IntelliJ-IDEA-Project-language-level-%EC%84%A4%EC%A0%95%EC%9D%98-%EC%9D%98%EB%AF%B8)

Project language level은 IntelliJ의 editor(편집기)와 java compiler가 사용할 language level을 설정한다. 예를 들어, JDK 1.7을 사용하고 있지만 java 코드가 JDK 1.6과 호환되도록 하려면 language level 실제 JDK 지원(JDK 1.7의 경우 7.0)보다 낮은 6.0으로 설정하면 된다.

 

Java 컴파일러 명령인 javac의 옵션을 보면 -source 및 -target 옵션을 통해 Java의 대체 버전을 기준으로 컴파일할 수 있음을 알 수 있다. 이를 통해 Project language level은 IntelliJ에게 특정 Java 언어 버전에서 제공된 Java SDK를 사용하도록 지시한다.
그래서 Java 7이 설치되어 있어도 language level을 6.0으로 설정할 수 있고, IntelliJ는 Java 7 대신 Java 6을 기준으로 코드를 확인하고, suggestion을 제공하며, 컴파일한다.

 

 

 

 

2. 원하는 버전 다운로드

1) 아래 링크 접속

https://www.azul.com/

 

Home

Introducing Cloud Native Compiler Offload JIT compilation with the Cloud Native Compiler to enhance the performance of Java applications in any compute environment.

www.azul.com

 

Download Now 클릭

 

2) 원하는 버전 다운로드

아래로 내리다보면 버전이 내림차순으로 정렬되어 있습니다.

 

원하는 버전과 운영체제 확인 후 다운로드!

m1 macOS는 ARM 프로세서를 선택해야 합니다.

 

 

3. 설치 파일 실행시켜서 로컬에 설치

요건 그냥 설치하면 되니까 넘어가겠습니다.

 

 

 

 

 

3. 터미널에서 환경변수 설정

1) JDK 설치 경로 이동

cd /Library/Java/JavaVirtualMachines/

 

2) ls 커맨드로 JDK 폴더명 확인

3) 경로 복사

/Library/Java/JavaVirtualMachines/{zdk폴더명}/Contents/Home

예시 : /Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home

 

4) bash_profile 편집

vi ~/.bash_profile

위 명령어를 입력하면 bash_profile 파일을 편집할 수 있습니다.

 

(커맨드 정리)

편집하기 : i

편집상태 끝내기 : esc

저장하고 나가기 : :wq 입력 후 엔터

위와 같이 수정해야 합니다.

JAVA_HOME 변수는 위에서 복사한 경로를,

PATH 변수는 위의 사진대로 수정해줍니다.

 

5) zshrc 편집

vi ~/.zshrc

위와 똑같이 추가해주면 됩니다.

(다른 환경변수가 이미 있을 수도 있습니다)

 

6) 환경변수 설정 변경 반영

source ~/.bash_profile
source ~/.zshrc

터미널에 위 명령어를 차례로 입력해줍니다.

 

7) Java 버전 확인

java -version

아래처럼 버전이 바뀐 것을 볼 수 있습니다.

 

 

자 그럼 이제,

위의 1번(IntelliJ JDK 버전 변경)으로 돌아가서

원하는 버전으로 바꿔주시면 끝입니다!!

 

고생하셨습니다 ^_^

 

 

 

 

 

반응형
반응형

나는 빠르게 공부하고 프레임워크 공부로 넘어가야했기 때문에

가장 인기 있는 교재인 '자바의 정석'은 길이가 너무 길어 패스했다. (나중에 필요하면 보는 걸로~)

 

Java의 기초를 다지기 위해

생활코딩의 '생활코딩 JAVA 입문 수업',

위키독스의 '점프 투 자바'

두 가지 자료를 모두 정독했다.

 

각각의 특징과 추천 대상에 대해 얘기해보고자 한다.

 

 

 

 

생활코딩 - JAVA 입문 수업

 

생활코딩 JAVA 입문 수업 - 생활코딩

본 수업은 2019년에 제작된 자바 수업으로 2013년에 제작된 생활코딩 JAVA 수업의 리뉴얼된 수업입니다.  수업소개 이 수업은 가장 인기있는 컴퓨터 언어인 Java의 기본을 알려드리는 수업입니다.

opentutorials.org

유튜브 동영상 강좌로 진행된다.

 

이 수업은 정확히 Java 강의라기보다는,

Java의 기초를 알려주고 그것을 활용해 프로그래밍 전반에 입문시키는 강의라고 하는 게 정확하겠다.

 

프로그래밍을 아예 처음 시작했다고 가정하고,

프로그래밍이란 무엇인지, 우리가 이것을 왜 공부하고 어떻게 적용하며 발전시켜 나갈 것인지,

초심자가 방향을 잃지 않고 발전할 수 있도록 태도, 공부법 등에 대해서 함께 일러준다.

심금을 울리는(?) 문장들을 자주 들을 수 있다.

 

프로그래밍이 처음이라면 아주 도움이 되겠으나,

이미 프로그래밍을 공부한 상태에서 Java를 공부하고 싶은 것이라면 난이도가 낮고 부연설명이 길다고 느낄 수 있겠다.

그래서 나는 웬만한 내용은 스킵하면서 아주 빠르게 완강했다.

 

 

 

 

위키독스 - 점프 투 자바

 

점프 투 자바

**초보 프로그래머를 위한 자바 입문서** 이 책은 문법위주의 지식보다는 이해중심의 지식을 전달하는 것을 주 목적으로 한다. 예를 들어 자바에서 잘 파악하기 힘든 개념 ...

wikidocs.net

위키독스를 만드신 '박응용'님께서 만드신 자료.

동영상 강의는 아니고, 인터넷에 배포된 자료(책)을 따라가는 구조다.

 

언어 전반에 대한 내용은 다루면서, 깊이가 너무 얕지도 깊지도 않다고 느꼈다.

다른 언어를 공부한 경험이 있다면, 90~100%를 어렵지 않게 소화할 수 있을 것이다.

 

다만 프로그래밍이 처음이라면, 조금 어려움을 겪을 수 있겠으나

천천히 이해하면서 진행한다면 크게 무리는 없을 것이다!

 

설명과 비유, 그리고 내용이 너무 좋았다!

문제 난이도도 적당해서 재밌게 풀면서 넘어갔다.

 

개발을 어느정도 경험하고 다시 보니, 점프 투 자바는 진짜 개발에 필요한 내용 위주로 간결하게 다룬 것이라는 것을 깨달았다.

 

 

 

 

 

총평

- 프로그래밍이 처음이다 -> 생활코딩

- 다른 언어를 공부해본 경험이 있다 -> 위키독스(점프 투 자바)

 

자바를 오래 쓸 거라면 '자바의 정석' 같은 자세한 기본서를 보는 것이 참 좋겠지만!

빠르게 공부 후 개발을 진행해야 한다면 '점프 투 자바'를 진짜 강추한다.

 

프로그래밍 초심자가 Java를 통해서 프로그래밍에 입문하고자 한다면, 생활코딩의 강의를 추천한다.

강사님의 말씀 하나하나가 좋은 개발자로 성장하는 데에 방향키가 되어줄 것이라고 생각한다.

다만 그 깊이를 더하고 싶다면, 완강 후 '점프 투 자바'를.. 공부해보시길..

 

 

 

 

 

반응형

+ Recent posts