아래에 설명한 모든 소스는 https://www.mycompiler.io/ko/new/java 에서 실행 가능합니다.
#1. 자바 8이상에서 작동하는 stream(스트림) 메서드 및 더블콜론(:: 클래스참조연산자) 의 사용(아래)
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
class Main {
public static void main(String[] args) {
// List 생성
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
// 스트림 메서드를 사용하지 않을 때 예시(아래)
// List를 순회하며 "apple"을 찾고 대문자로 변환
for (String s : list) {
if (s.length() >= 5) {
System.out.println(s);
}
}
System.out.println("===============");
// List를 Stream으로 변환하고 길이가 5 이상인 요소를 필터링
list.stream()
.filter(s -> s.length() >= 5)
.forEach(System.out::println); //더블콜론 : 메서드 참조 연산자 사용
System.out.println("===============");
// List를 Stream으로 변환하고 반복문(map, forEach)로 모든 문자를 대문자로 변환한 후 출력
list.stream()
.map(String::toUpperCase)
.forEach(System.out::println); //더블콜론 : 메서드 참조 연산자 사용
System.out.println("===============");
// List를 Stream으로 변환하고 문자열 리스트 요소들의 길이를 합산
int totalLength = list.stream()
.mapToInt(String::length) //더블콜론 : 메서드 참조 연산자 사용
.sum();
System.out.println("Total Length: " + totalLength);
}
}
- 위 코드를 실행한 결과 미리보기 (아래)
#2. 자바 12에서 사용가능한 매개변수에서 객체 생성하기(아래)
- 핵심코드(아래)
if(p instanceof Student stu) { //자바12부터 아렇게 사용가능 Student [stu] 자바12 아래버전에서는 stu를 못 붙인다.
System.out.println("****** Student Info ******");
((Student) p).applyForClasses();//자바11에서 사용
stu.applyForClasses();//자바12에서 사용
... 이하 생략
- 그외 은닉, 상속, 다형성, 제한자 등을 설명하고 있다.(아래)
public class Main {
public static void main(String[] args) {
Person p = new Person("홍길동", 25);
System.out.println(p.getDetails());
Person p2 = new Student("홍길서", 23, "생물학"); //선언과 생성한 클래스가 다르다. 부모 타입에 자식 객체를 참조 = 다형적 객체
System.out.println(p2.getDetails());
p2 = new Teacher("홍길남", 35, "자바프로그래밍");
System.out.println(p2.getDetails());
Object obj = p2;
Object obj2 = new Employee("홍길북", 30, "교무처");
System.out.println(((Employee) obj2).getDetails()); // Virtual Method Invocation 형변환이 필요하다.
// 컴파일시 부모의 메서드 유/무 체크, 런타임 시 생성된 객체의 메서드를 호출
Object[] objArr = new Object[5];
objArr[0] = "Hello";
objArr[1] = p;
objArr[2] = "-";
objArr[3] = p2;
objArr[4] = 200; // new Integer(200); 랩퍼 클래스를 사용하지 않고 오토박싱으로 사용한다.
// 배열은 동종모음(Homogeneous collection) 이지만 다형성이 적용되면 이종모음(Heterogeneous collection)이 가능하다.
// 은닉: private 변수, public 메서드, 메서드는 코드 블록{}을 가지고 있으므로, 입력값 검증코드를 포함할 수 있으므로 사용.
// 상속: 부모의 멤버(변수,메서드)를 상속받음.(다중 상속은 불가)
// 부모의 변수가 private 이니 자식의 생성자에서 super()를 사용함.
// 부모의 멤버를 참조하려고 super.을 사용함.
// 재정의: 리턴타입, 이름, 매개변수가 동일, 접근제한자는 more public, 부모에서 throws하지 않는 새로운 예외는 throws못함
//다형성:
// 상속을 전제
// 부모타입으로 선언하고, 자식타입의 객체를 참조 - 다형적 객체
// Virtual Method Invocation : 컴파일 시 선언한 클래스의 메소드를 체크, 실행 시 생성한 객체의 메서드를 호출하는 것을 말함.
// 이종모음: 배열에 다형성이 적용되면, 배열에 다른 타입을 저장할 수 있다.(위 배열 객체에서 설명됨.)
// Wrapper class : 자바9버전 이후 deprecated. 오토박싱(Auto Boxing)이 되기 때문에 그냥 사용한다.(위 배열 겍체애서 설명됨)
// 다형적 인자, instanceof 사용(main 아래 소스에서 설명됨)
// 버전별 자바 로드맵 https://www.oracle.com/java/technologies/java-se-support-roadmap.html
//Usage Modifier (제한자 사용)
// static,
System.out.println(objArr[4]);
double number = 10; //큰 타입에서는 작은 타입을 넣을 수 있다.
Student s = new Student("이순신", 30, "컴퓨터공학");
System.out.println(s.getDetails());
Teacher t = new Teacher("김일국", 31, "모바일앱개발");
System.out.println(t.getDetails());
Employee e = new Employee("직원명", 32, "관리부");
System.out.println(e.getDetails());
System.out.println("-------------------------------------");
printPersonInfo(p);
printPersonInfo(s);
printPersonInfo((Person)objArr[3]); // 배열 객체의 타입은 Object 이기 때문에 Person 타입으로 형변환을 한다.
} // main 끝
public static void printPersonInfo(Person p) {
if(p instanceof Student stu) { //자바12부터 아렇게 사용가능 Student [stu] 자바12 아래버전에서는 stu를 못 붙인다.
System.out.println("****** Student Info ******");
((Student) p).applyForClasses();//자바11에서 사용
stu.applyForClasses();//자바12에서 사용
}else if(p instanceof Teacher) {
System.out.println("****** Teacher Info ******");
}else if(p instanceof Employee) {
System.out.println("****** Employee Info ******");
}else {
System.out.println("****** Person Info ******");
}
System.out.println(p.getDetails());
}
}
class Person {
private String name;
private int age;
public Person() {
this("이름없음");
}
public Person(String name, int age) {
super(); // 생략 가능
this.name = name;
this.age = age;
}
public Person(String name) {
this(name, 1); // 현재 클래스의 생성자
}
public String getDetails() {
return "이름: " + name + "\n나이: " + age;
}
}
class Student extends Person {
private String major;
public Student() {
super();
this.major= "전공없음";
}
public Student(String name, int age, String major) {
super(name, age);
this.major = major;
}
@Override
public String getDetails() {
return super.getDetails() + "\n전공: " + major;
//return "이름: " + name + "\n나이: " + age + "\n전공: " + major;
}
public void applyForClasses() {
System.out.println("수강신청 합니다.");
}
}
class Teacher extends Person {
private String subject;
public Teacher(String name, int age, String subject) {
super(name, age);
this.subject = subject;
}
@Override
public String getDetails() {
return super.getDetails() + "\n과목: " + subject;
}
}
class Employee extends Person {
private String department;
public Employee(String name, int age, String department) {
super(name, age);
this.department = department;
}
@Override
public String getDetails() {
return super.getDetails() + "\n부서: " + department;
}
}
##3. 기타 등등(아래)
- 멤버변수(힙 메모리), 지역변수(스택 메모리) 에 대한 의미(아래)
public class Main {
public static void main(String[] args) {
Pen redPen = new Pen("빨강", 900); //인스턴스화, 객체를 만들었음.
System.out.println(redPen);
redPen.write(2);
}
}
class Pen {
//멤버변수, heap 메모리에 저장=초기화필요없음.
String color = "black";
int price;
//메서드
public void write(int count) {
int data = 1; //지역변수 stack 메모리(LIFO구조)에 저장=반드시 초기화필요
System.out.println(price);
System.out.println(data);
System.out.println(count); //count 는 지역변수이면서 매개변수
System.out.println(color);
System.out.println("Hello World");
}
//생성자=객체의 멤버변수 초기화
public Pen(String init_color, int init_price) {
//super();
color = init_color;
price = init_price;
} //기본생성자는 자동으로 생성된다. 없어도 된다.
}
- 인터페이스를 이용한 람다식 및 자바10버전 부터 타입없이 var 변수사용(아래)
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
//자바10 버전부터 var 변수선언으로 타입 생략 가능(아래)
var myList = new ArrayList<String>();
System.out.println(myList.size());
var str = "hello";
var x = 10;
x = 20;
//var x = "Hello"; //에러
System.out.println(str + " " + x);
List<String> myList2 = new ArrayList<>(); //제네릭 타입 생략 가능
System.out.println(myList2);
MyFunction myFunc = (s) -> s.length(); //람다식 String s 에서 String 타입 생략하고, 인터페이스 구현 메서드를 사용가능.
System.out.println(myFunc.myMethod("Hello"));
}
}
@FunctionalInterface
interface MyFunction {
int myMethod(String s); //인터페이스는 메서드 명만 존재한다.
}
- 싱클톤으로 중복 객체사용 방지(아래)
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1==s2);
System.out.println(s1);
System.out.println(s2);
}
}
class Singleton { //싱글톤이란? 클래스의 객체가 1개만 만들어 지도록 유지하는 기능의 클래스 (메모리 낭비 방지)
private static Singleton instance = new Singleton();
private Singleton() {
System.out.println("외부에서는 해당 객체를 생성할 수 없도록 생성자를 private로 지정한다. 객체생성은 getInstance()호출로만 가능하다");
}
public static Singleton getInstance() {
return instance;
}
}
- 자바8이상에서 작동되는 스트림메서드, 더블콜론 연산자, 인터페이스에서 람다식 사용(아래)
import java.util.Arrays;
import java.util.function.Function;
public class Main {
public static void main(String[] args) {
String[] names = { "Erid", "JinKyoung", "Bar", "Foo" };
// Arrays.sort(names); // 기본은 알파벳기준 오름차순 정렬
// Arrays.sort(names, new StringComparator()); //메서드 인수로 특정 인터페이스를 구현할 때 람다식으로 간략화 할 수 있다.(아래)
Arrays.sort(names, (a, b) -> a.length() - b.length()); //문자열 길이기준 오름차순 정렬로 변경
for (String name : names) {
System.out.println(name);
}
System.out.println("-----------------------------");
Arrays.asList(names).stream()
// .map(new Myfunction())); //아래 MyFunction클래스 참조없이 더블콜론으로 클래스참조를 하면, 코딩이 줄어 든다.(아래)
// .map(s -> s.toUpperCase()
.map(String::toUpperCase).forEach(System.out::println);
}
}
//class MyFunction implements Function<String, String> {
// @Override
// public String apply(String t) {
// return t.toUpperCase();
// }
//}
//
//class StringComparator implements Comparator<String> {
// public int compare(String a, String b) {
// return a.length() - b.length();
// }
//}
Ps. 최신 자바 보수 교육 이수증(아래)
Ps. 위 과정은 중급 강좌이고, 기초 강좌를 원하시면, 인프런의 기초부터 시작하는 자바 프로그래밍 강좌를 추천 드립니다.(아래)
기초강좌 교재 : https://bookk.co.kr/bookStore/661b9cd15a7d7f2f836b7d28
Spring부트에서 WebFlux 웹 프레임워크 사용해 보기 (1) | 2024.05.02 |
---|---|
스프링부트2 프로젝트를 스프링부트3로 마이그레이션_3/3 (1) | 2024.01.31 |
스프링부트2 프로젝트를 스프링부트3로 마이그레이션_2/3 (0) | 2024.01.30 |
스프링부트2 프로젝트를 스프링부트3로 마이그레이션_1/3 (1) | 2024.01.28 |
헤로쿠 클라우드플랫폼 기존에 사용하던 스택 업그레이드 (0) | 2022.08.19 |
댓글 영역