[Java #15 / 250326] 추가적인 자바

temi·2025년 3월 28일

Java

목록 보기
15/15

학원에서 학습한 내용을 개인정리한 글입니다.


수업

BuilderPattern

  • 내부 클래스를 이용해서 생성하는 방식
  • 생성자를 여러개생성??하는것보다?? 유연하게 사용 가능
public static void main(String[] args) {
	//빌더 패턴에 대해 알아보자
	//내부 클래스를 이용해서 생성하는 방식
//		Student s = new Student();
	Student t = Student.builder()
			.name("김ㅇㅇ")
			.height(180.5)
			.build();
}
package com.extra.model.vo;

public class Student {
	private String name;
	private int age;
	private double height;
	private String address;
	private char gender;
	private Student() {
	}
	private Student(String name, int age, double height, String address, char gender) {
		this.name = name;
		this.age = age;
		this.height = height;
		this.address = address;
		this.gender = gender;
	}

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	
	//내부 클래스로 생성하는 로직을 작성
	public static class Builder {
		private String name;
		private int age;
		private double height;
		private String address;
		private char gender;
	
		public Builder() {}
		
		public Builder name(String value) {
			this.name = value;
			return this;
		}
		public Builder age(int value) {
			this.age = value;
			return this;
		}
		public Builder height(double value) {
			this.height = value;
			return this;
		}
		public Builder address(String value) {
			this.address = value;
			return this;
		}
		public Builder gender(char value) {
			this.gender = value;
			return this;
		}
		
		public Student build() {
			return new Student(name, age, height, address, gender);
		}
	}
	
	public static Builder builder() {
		return new Builder();
	}
	
}

Enum 객체

EnumType 활용

  • 정해진 값들을 매칭해서 사용
public enum Gender {
	A("중성"), M("남자"), F("여자");
	
	private String value;
	
	private Gender(String value) {
		this.value = value;
	}
	
	public String getGender() {
		return value;
	}
}
  • 클래스처럼 활용
package com.extra.common;

public enum StudentController {
	controller;
	private MainView view = MainView.view;
	
	public void mainMenu() {
		System.out.println("main");
		view.mainMenu();
	}
	
	public void insertStudent() {
		System.out.println("insert");
		view.insertStudent();
	}
}
package com.extra.common;

import java.util.Scanner;

public enum MainView {
	view;
	private Scanner sc = new Scanner(System.in);
	
	public void mainMenu() {
		System.out.println("mainmenu");
	}
	public void insertStudent() {
		System.out.println("insert");
	}
}

Record

Recode 객체

  • 데이터 보관용 클래스를 간편하게 해줌
  • getter/setter를 선언하지않음
  • 수정 불가능한 객체 필드가 final로 선언됨
  • 자동으로 getter, toString, hashCode, equals 생성해줌
  • 필드 선언도 안함
package com.extra.model.vo;

public record Animal(String name, int age, double weight) {
	@Override
	public String toString() {
		return name + "," + age + "," + weight;
	}
	
}
Animal a = new Animal("덕만", 7, 5.4);
		Animal a2 = new Animal("김춘식", 5, 5.5);
		Animal a3 = new Animal("김춘식", 5, 5.5);

		System.out.println(a2);
		System.out.println(a.equals(a2));
		System.out.println(a3.equals(a2));
		Set<Animal> set = new HashSet<Animal>();
		set.add(a);
		set.add(a2);
		set.add(a3);
		
		System.out.println(set);
		
		//필드값 가져오기
		System.out.println(a.name());

타입추론 예약어

  • 지역변수에서만 사용이 가능
  • var 예약어
  • 들어간 값에 맞춰서 클래스타입이 변경된다
var name = "ooo";
var age = "19";
List<Integer> numbers = List.of(1,2,3,4,5,6,7);
for(var n : numbers) {
	
}

instanceof

  • 비교적 최신버전에서 확인 가능 (Jdk 21)
  • 자료형을 확인하는 Instanceof
  • swtich 패턴 매칭 문법
Object o = new String("switch");
swtich(o){
	case String s ->{System.out.println(s.length()});
	case Integer i ->{}
	default () -> {throw new IllegalAccessException});
}

Reflection

  • 런타임이 클래스 내용을 확인, 조작할 수 있는 기능
  • class, field, method 클래스 이용하여 처리
Class studentClass = s.getClass();
String path = studentClass.getResource("/").getPath();
System.out.println(path);
System.out.println(studentClass.getName());
//클래스에 선언된 메소드, 필드, 어노테이션
Method[] methods = studentClass.getDeclaredMethods();
for(var method: methods) {
	System.out.println(method.getName());
	System.out.println(method.getModifiers());
	Class re = method.getReturnType();
	System.out.println(re.getName());
}
💡

QNA

Temi: 리플렉션을 사용하면서 생각한건데, 코딩에서 프라이빗 멤버를 사용하는 것이 코드 보안에 어떤 이점을 주는지? 프라이빗 멤버에 기본적으로 접근할 수 없도록 제한하는 것이 보안에 어떻게 도움이 되는지도 궁금

Teacher: 정보은닉, 정보제한 및 데이터의 직접접근 및 이상한 데이터가 들어가는 것을 막을 위함임. 리플렉션은 프라이빗을 접근가능하게 허용한다던지 하는 문제때문에 잘 쓰지않음. 그리고 느림.


Stream Calss

  • 효율적인 관리를 위한 API
  • 제공하는 메소드를 이용해서 저장된 데이터를 관리하는 기능

profile
250304~

0개의 댓글