상세 컨텐츠

본문 제목

최신 자바 보수 교육을 받았습니다.

JSP·자바·코틀린

by 김일국 2025. 4. 11. 12:31

본문

아래에 설명한 모든 소스는 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://www.inflearn.com/course/%EA%B8%B0%EC%B4%88-%EC%9E%90%EB%B0%94-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

기초강좌 교재 : https://bookk.co.kr/bookStore/661b9cd15a7d7f2f836b7d28

관련글 더보기

댓글 영역