IDE란
intergrated Development Eviroment
통합 개발환경 코딩을 비롯해 개발에 필요한 각종 작업을 도와주는 소프트웨어
다음을 포함함
- 소스코드 편집기
- 빌드 자동화
- 디버거
소스코드 편집기 :
코드를 직접 작성하고 편집할 수 있는 기능과 문법적으로 올바른 코드인지 검사하여 사용자에게 보여주는 기능을 포함
자동 완성으로 코드 작성을 도와주는 것 역시 소스코드 편집기의 기능이다.
소스코드 편집기로 작성된 코드를 컴퓨터가 실행할 수있는 binary 코드 형태로 변환하는 것을 의미한다.
해당 과정을 자동화 해주는 것 버튼 하나만 클릭하면 모든 테스트 코드를 실행하며 테스트 코드가 성공하면 빌드까지 해준다.
소스코드의 어떤 부분에서 문제가 발생했는지를 분석하는 프로그램이다.
개발자는 이정보를 참고하여 효율적으로 문제를 파악하고 수정할 수 있다.
JDK, SDK 차이
SDK(Software Devlopment kit)는 소프트웨어를 개발하기 위한 필요한 도구의 모음,
자바 애플리케이션을 개발할 수 있는 도구는 JDK(java Development Kit)는 SDK의 한 종류로 JDK말고도 소프트웨어를 개발하는데 활용하는 라이브러리라면 역시 SDK로 분류할 수 있음.
JDK는 자바 개발에 필요한 도구를 포함하는 소프트웨어로
자바컴파일러 .java코드를 .class파일로 컴파일
JRE(JAVA Runtime Evironment)는 문자 그대로 자바 애플리케이션을 실행할 수 있는 환경을 제공하는 소프트웨어로 구성되어 있음
JRE 안에 있는 JVM(java virtual muchine)이 사실 .class 파일을 실행하는 주체
JDK를 설치하면 JRE가 포함되어 있지만 JRE만 별도로 설치 할 수도 있다.

JDK 설치시 우리가 설치한 JDK가 Open JDK라는 것과 LTS버전이라는것
OpenJDK : 말 그대로 오픈 소스로 공개된 JDK
LTS (Long Term Support)란 장기간 기술 지원을 받을 수 있다는 의미
자바는 JDK 8, 11, 17, 21을 LTS 버전으로 지정했고 JDK 17의 경우 2029년 9월까지 지원이 확정된 상태
컬렉션 중 Hash로 시작하는 컬렉션인 HashMap , HashTable, HashSet는 동일한 값을 비교하기 위해 hashCode() 메서드를 모두 사용한다.
만약 equeals() 메서드만 오버라이딩하고 hashCode()메서드는 오버라이딩 하지않는다면 Hash로 시작하는 컬렉션에서 같은 값으로 판단해야 할 인스턴스들이 마치 다른 인스턴스인 것처럼 동작한다.
class Person {
private String name;
private int age;
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Person)) return false;
Person person = (Person) obj;
return age == person.age &&
Objects.equals(name, person.name);
}
// hashCode()를 재정의하지 않으면 문제 발생!
}
equals()를 재정의했다면 반드시 hashCode()도 재정의해야 한다.
그 이유는:
1. equals()가 true인 두 객체는 반드시 같은 hashCode 값을 반환해야 함
2. 이것은 Java의 객체 계약(Object contract)임
// 1. p1 객체를 생성
Person p1 = new Person("John", 30); // hashCode = 100
// 2. HashMap에 p1과 "Value1"을 저장
map.put(p1, "Value1"); // 100 위치에 저장됨
// 3. p2 객체를 생성 (HashMap과는 무관!)
Person p2 = new Person("John", 30); // hashCode = 200
// 4. p2의 hashCode(200)를 이용해 HashMap에서 검색
String value = map.get(p2); // 200 위치에서 찾지만 없음
해시 기반 컬렉션들은:
객체의 hashCode()를 사용해 저장 위치를 결정
hashCode()가 재정의되지 않으면 같은 내용의 객체도 다른 위치에 저장됨
hashCode() 재정의 시 주의사항:
람다 표현식을 보면 익명 함수를 머릿속에 떠올릴 수 있어야 한다. 함수는 함수인데 이름 없는 함수
자바에서 함수를 선언하는 방법은
자바 기본 문법에서는 함수만 따로 선언할 수 없고 클래스가 있어야 한다. 즉 클래스를 먼저 선언한 다음
그 안에 함수를 선언해야 그 전체를 메서드라고 부를 수 있다.
중요한 점은 클래스와 메서드에 모두 이름을 붙여 줘야 하나의 함수로 사용할 수 있다는 것
임시로 사용할 변수 때문에 매번 클래스 선언을 것은 불편, 심지어 이름까지
이러한 불편함 때문에 익명클래스를 사용하기도 하지만 , 이 역시 코드길이상 불편
package EBD._3;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class 람다 {
public static void main(String[] args) {
List list = new ArrayList<String>();
list.add("public");
list.add("static");
list.add("void");
// 익명 클래스 코드
list.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
// 람다 표현식 코드
list.sort((Comparator<String>) (str1, str2) -> str1.compareTo(str2));
}
}
코드가 얼마나 간결해 졌는가 우리는 코드에서 로직을 보고자 하지 , 복잡한 문법을 보고자 하는 것이 아니다.
또한 스트림 API와도 잘 어울린다.
스트림 API
컬렉션에 추가된 메서드의 집합을 의미
스트림 API가 호출되는 컬렉션 객체의 요소들을 인자로 들어온 람다 표현식을 통해 처리
package EBD._3;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<String>();
list.add("public");
list.add("static");
list.add("void");
// for문으로 List 순회 가능
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
/**
* 실행결과
*
* public
* static
* void
*/
스트림 API 사용
package EBD._3;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<String>();
list.add("public");
list.add("static");
list.add("void");
list.stream().forEach(str -> System.out.println(str));
}
}
/**
* 실행결과
*
* public
* static
* void
*/
더이상 반복문의 i를 알 필요가 없어짐
리스트에 1~10까지의 수를 넣고, 그 리스트에서 2의 배수만으로 이루어진 리스트를 뽑는 예제
package EBD._3;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<Integer>();
List evenList = new ArrayList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
if (i % 2 == 0){
evenList.add(i);
}
}
System.out.println(list);
System.out.println(evenList);
/**
* [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
* [0, 2, 4, 6, 8]
*/
}
}
/**
* 실행결과
*
* public
* static
* void
*/
스트림 API 사용
package EBD._3;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Integer[] integers = new Integer[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
List<Integer> list = Arrays.asList(integers);
List evenList = list.stream()
.filter(value -> value % 2 == 0).collect(Collectors.toList());
evenList.stream().forEach(value -> System.out.print(value));
/**
* 실행결과
* 246810
*/
}
}
컬렉션의 요소를 처리하는 것이라고 생각하자.
요소하나씩 꺼냄
조건문에 맞는 요소만 뽑아 새로운 스트림을 만듬
collect 전체리스트 요소중 조건문을 만족하는 요소를 뽑아 새로운 리스트를 만듬
중복제거
람다 표현식을 함수의 인자로 넘겨줄 필요 X
이떄 중복인지 아닌지를 판단하는 것은 요소들의 equals() 메서드
컬렉션의 요소들에 특정 연산을 적용한 새로운 스트림
입력으로 들어간 컬렉션의 수와 출력으로 나오는 컬렉션의 수는 동일
ex) 문자열 컬렉션의 모든 소문자 요소들을 대문자로 바꾸는 새로운 컬렉션
filter, distint map과 함께 .collect(Collection.toList()) 형태로 사용하면 스트림을 간단하게 리스트로 만들수있다.
자바 16버전 부터는 .collect(Collection.toList()) 대신 .toList()를 사용해 간결하게 코드를 작성하는것이 가능해졌다.