![@ParameterizedTest](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsdWBj%2FbtsHcsuLRFN%2FU2go3LWVcigANRJeHXJxq1%2Fimg.png)
문제상황JUnit을 활용하여 String 메서드의 단위 테스트를 진행하던 중 여러 값을 테스트하려니다음과 같이 중복 코드가 발생한다.private Set numbers;@Testvoid contains() { assertThat(numbers.contains(1)).isTrue(); assertThat(numbers.contains(2)).isTrue(); assertThat(numbers.contains(3)).isTrue();} 해결방안JUnit의 @ParameterizedTest를 사용하면 아래와 같이 중복 코드를 해결할 수 있다.@ParameterizedTest@ValueSource(ints = {1, 2, 3})void contains_with_parameterizedTest_V..
![[Java] Map의 value 값들을 리스트로 반환받기](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkXspH%2Fbtr3S0byhIR%2FHvv9eljn2rDIqzZjMkCcWk%2Fimg.png)
♪ 학습 내용 Map.values() / Collection vs List / stream.collect() 토이 프로젝트 중 Repository인 Map에서 List 형태로 값을 받아와야 하는 경우가 생겼었다. * Map의 value들을 반환 기본적으로 Map의 value 를 꺼내려면 key 값을 이용해서 꺼낼 수 있다. import java.util.HashMap; import java.util.Map; Map map = new HashMap(); map.get(key); 하지만 이렇게 하면 하나씩 밖에 꺼내지 못한다. 따라서 모든 value값 ( key 값도 가능)을 얻기 위해 map.values() import java.util.HashMap; import java.util.Map; Map map..
![[Java] 멀티스레드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgullL%2FbtrQ4WTgEJb%2FhEMYueJ6mT0MsJH3Lqj6l0%2Fimg.png)
* 프로세스 및 스레드 개념 프로세스는 실행 중인 하나의 애플리케이션이다. 만약에 크롬 브라우저를 두 개 띄워놨다면, 두개의 Chrome 프로세스가 생성된 것이라고 이해 멀티 태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미한다. 예로 미디어 플레이어는 동영상 재생과 소리 재생을 동시에 처리하는데 이를 가능하게 하는 것이 바로 멀티 스레드이다. 스레드란 한 가닥의 실 이라는 의미로, 하나의 스레드는 하나의 코드 실행 흐름이다. 미디어 플레이어에서 동영상 재생과 소리 재생은 각각 하나의 스레드( 실행 흐름 )라고 보면 될 거 같다. 멀티 프로세스는 자신의 메모리를 할당 받아 실행하기 때문에 독립적이다 ex ) 워드와 ppt를 실행 중에 워드에 오류 생겨도 ppt는 정상 작동한다 반면에 멀티 스레드..
![[Java Exception] NoSuchBeanDefinitionException](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyjyLQ%2FbtrQrF5DfVY%2FoyZSKyUPQID1MlZUhFUpBk%2Fimg.png)
* NoSuchBeanDefinitionException 조회 대상인 스프링 빈이 없으면 발생하는 예외 * 에러 컨테이너에 등록되어 있는 스프링 빈을 이름으로 조회하는 방식에서 해당 에러가 발생했다. * 에러 해결 NoSuchBeanDefinitionException 가 발생 즉, 16번째의 getBean 에서 조회하고자 하는 스프링 빈이 존재하지 않는다는 것...! 스프링 빈의 등록 과정에서 문제가 있었거나, 다른 이름을 잘못 적었을 것이라 추측 확인해보니 이름에 오타가 있었다. 후에 다시 실행
![[Java Exception] java.lang.NullPointerException](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Feda87i%2FbtrPJdJoLDa%2FhCsy6A3NCuKEn7TKygXbgK%2Fimg.png)
* NullPointerException 자바 프로그램에서 가장 빈번하게 발생하는 실행 예외 null 값을 갖는 참조 변수로 객체 접근 연산자인 " . " 를 사용했을 때 발생한다. 즉, 객체가 없는 상태에서 객체를 사용하려 해서 발생하는 예외인 것이다. public class NullPointerExceptionExample{ public static void main(String[] args){ String data = null; System.out.println(data.toString()); } } data 변수는 null 값을 가지기 때문에 String 객체를 참조하지 않는데 String객체의 toString()을 호출하고 있다. NullPointerException 발생 * 에러 이처럼 jav..
![[Java] 인터페이스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRAoBo%2FbtrPL3ZQalU%2FTvcuNNftDiE8imsKS8njm0%2Fimg.png)
인터페이스란 객체의 사용 방법을 정의한 타입이다. 인터페이스를 두는 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 중간에 변경할 수 있도록 하기 위해서이다. 즉, 하나의 객체가 아니라 여러 객체들과 사용이 가능하므로 어떤 객체를 사용하느냐에 따라 다양한 결과값을 가진다. public interface RemoteControl{} //RemoteControl이라는 인터페이스 선언 일반 클래스는 필드 / 생성자 / 메서드를 멤버로 가지지만, 인터페이스는 상수 / 메서드만을 가진다. public interface GameRule{ //상수 int time= 30; public static final int player = 2; //추상 메서드 void gameSetting(//매개변수); //디폴트 메서..
![[Java] 추상클래스](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbangf5%2FbtrPIZdQH0B%2F4R3LEeqCgMIaVFnHTuYseK%2Fimg.png)
객체를 직접 생성할 수 있는 클래스를 실체 클래스라고 한다면, 이 실체 클래스들의 공통적인 특성을 추출해 선언한 클래스를 추상 클래스 라고 한다. 추상 클래스와 실체 클래스는 상속의 관계에 있어, 실체 클래스는 추상 클래스의 모든 특성을 물려받는다. 추상 클래스는 실체 클래스들을 추출해서 만들었기 때문에 직접 객체를 생성하지 못한다. 즉 , new( ) 연산자를 사용할 수 없다. 추상 클래스의 용도는 다음과 같다. 실체 클래스의 필드와 메소드의 이름을 통일화 시간 절약(추상 클래스로 설계 규격을 만들고, 상속해서 구체적인 클래스를 만들도록 지시함으로써) 추상 클래스는 abstract 키워드를 붙여 선언한다. public abstract class Animal{ public String name; publ..
![[Java] 다형성](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhCCaX%2FbtrPJW1s097%2FucAkMskK5OoX8uM1yEGOVK%2Fimg.png)
다형성이란 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 말한다. 다형성을 통하면 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있다. 자바에서는 다형성을 위해 부모 타입에 모든 자식 객체가 대입될 수 있게 한다. public class PhoneTest{ Phone phone1 = new IPhone(); Phone phone2 = new SPhone();//자식 객체가 부모의 타입인 Phone에 대입되었다. } 자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다. 자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다는 것이 바로 자동 타입 변환의 개념이다. public class Animal{ } public..
![[Java] 접근 제한자 / 싱글톤 패턴 / Getter , Setter](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxCgW8%2FbtrPJXziBap%2Ftb9kEOZGw1vJUreV6U02x0%2Fimg.png)
접근 제한자에는 public , protected, default, private 이렇게 4 가지가 있다. public 클래스, 필드, 생성자, 메서드를 선언할 때 public을 붙이면 public 접근 제한을 가진다. public 접근 제한을 가지게 되면 같은 패키지 내에서 뿐만 아니라 외부 패키지에서도 사용할 수 있다. default 클래스, 필드, 생성자, 메서드를 선언할 때 public을 생략한다면, default 접근 제한을 가진다. default 접근 제한을 가지게 되면 같은 패키지 내에서만 사용할 수 있다. protected protected 제한자는 public과 default 접근 제한의 중간쯤에 해당된다. 같은 패키지 내에서는 접근 제한이 없지만, 외부 패키지에서는 자식 클래스만 접근을..
![[Java] final 키워드](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq7OWg%2FbtrPJoEafZ6%2Fh9tW0dJNRQkKeXYdCp6R9K%2Fimg.png)
final 키워드는 클래스, 필드 , 메서드 선언 시에 사용할 수 있다. 필드 선언 시에 final을 붙이면 초기값으로 설정되어, 더 이상 수정할 수 없다는 것을 앞에서 확인 했었다.(like 상수) 그러면 만약 final 키워드를 클래스와 메서드 선언 시에 붙이면 어떻게 될까? public final class String{ ... } String 클래스는 자바 표준 api에서 제공하는 대표적 final 클래스이다. 이처럼 클래스를 선언할 때 final을 붙이면 이 클래스는 최종적인 클래스로 되어서 상속을 할 수가 없다. 따라서 final 클래스는 상속을 하지 못하므로 , 자식 클래스도 없고 부모 클래스도 아니다. public final class Food extends{//Food 클래스는 final..