Java 15

LSP

20241229Liskov Substitution Principle, LSP *"상위 클래스 사용하던 자리에는 하위 클래스 사용할 수 있다"*상위 클래스의 객체를 사용하는 모든 곳에서 하위 클래스의 객체로 대체하더라도 프로그램의 동작이 바뀌지 않아야 한다.==하위 클래스는 상위 클래스를 대체할 수 있어야 한다. ==상위 클래스가 기대하는 동작(계약)을 하위 클래스가 깨지지 않도록 동작해야 한다는 원칙상위 클래스의 역할을 유지해야함 상위 클래스의 메서드와 동작은 하위 클래스에서도 **동일하게 작동** 해야 함 하위 클래스는 상위 클래스가 가진 동작의 **의미**를 바꾸거나 깨뜨리면 안 됨.대체 가능성 보장 코드에서 상위 클래스를 사용하던 자리(메서드 호출, 변수 등)에 하위 클래스를 넣어도 **플고그..

Java 2024.12.29

리스트처리(for -> forEach), switch (enum), Null(Optional)

1. 리스트 처리 - IndexOutOfBoundsException 방지잘못된 코드 (전통적인 for문 사용)import java.util.List;public class IndexErrorExample { public static void main(String[] args) { List names = List.of("Alice", "Bob", "Charlie"); for (int i = 0; i  i 코드 작성자가 실수하기 쉬움좋은 코드 (Stream forEach 사용) import java.util.List;public class SafeIterationExample { public static void main(String[] args) { List..

Java 2024.12.25

추상화....인터페이스...

https://multifrontgarden.tistory.com/315 올바른 추상화와 인터페이스 설계이번엔 특별히 무언가 주제가 있다기보다 실무에서도 쉽게 접하는 상황에서 어떻게 인터페이스를 설계하는게 올바른지 예제를 통해 알아가보려 한다. 지난 포스팅의 후속작정도 될 것 같다. #multifrontgarden.tistory.com 인터페이스interface SocialLogin { void login(String clientKey); // 공통된 기능만 정의} 구현클래스class NaverLogin implements SocialLogin { private String userId; private boolean isAgreed; public NaverLogin(String us..

Java 2024.12.24

클라이언트 ip 가져오기

request.getClientIP() 로컬에선 문제가 없었으나 올리고 나니 문제가 생겼다.  백서버가 2개 있고, 로드밸런서가 있는데..  클라이언트 ip를 응답 데이터에 넣기 위해 request.getClientIP()그대로 썼더니 첨보는 ip가 튀어나온다.. 지피티가 로드밸런서나 프록시 ip로 예상된다고 알려준다.   x-forwarded-for 헤더가 안보인다.request.getHeader("X-Forwarded-For"); 를 로그로 찍어봐도 안나온다.따라서 설정이 안돼있다고 예상했다. 네, 로드밸런서에 X-Forwarded-For 헤더 추가 설정을 하면, request.getHeader("X-Forwarded-For")로 클라이언트 IP를 제대로 가져올 수 있을 가능성이 높습니다.현재 상황에..

Java 2024.12.24

추상 클래스 / 인터페이스

추상 클래스는 공통된 메서드와 필드를'상속받는 하위 클래스'에서 재사용하거나 활용할 수 있도록 설계된다. 구현된 메서드와 추상 메서드(구현되지 않고 하위 클래스에서 구현해야만 하는 메서드)를 모두 가질 수 있고,주로 상향식 설계에서 사용되며,관련 클래스 간 공통된 기능을 모아 캡슐화하고 코드 재사용성을 높이는데 유용하람쥐인터페이스는 클래스가 구현해야 할 메서드를 미리 선언만 하고,실제 구현을 구현하는 클래스에 위임한다. 다중 구현이 가능하고, 클래스가 특정 행동(메서드)을 반드시 구현하도록 강제하고 싶을 때 !! 밀이하향식 설계에 적합하다고 볼 수 있다 즉, 추상 클래스는 "공통된 기능을 캡슐화"하는 데 중점을 두고, 인터페이스는 "행동 규약을 강제"하는 데 초점이 맞춰져 있다람쥐추상 클래스 추상 클래스..

Java 2024.12.20

(지피티 선생님의) InvokeDynamic 특강

(지피티 선생님의) 람다와 일급 객체, FP 특강🍱  말밥: 람다와 일급 객체람다를 이렇게 생각해봐. ‘코드를 바로 손에 들고 쓸 수 있는 작은 조각’ 같은 거야. 한 번, 이런 상상을 해보자:🍳 요리사 이야기요리사가 있는데, 이 사람은 특99duuk.tistory.com이어서!!! 🍱 말밥: 인보크 다이나믹이 뭐야?자, 인보크 다이나믹(InvokeDynamic)은 자바의 "마술 도구" 같은 거야.평소에 우리가 코드를 실행할 때, 자바는 "야, 이 메서드 찾아봐!" 하면서 메서드 호출 경로를 딱딱하게 정해둬.그런데 인보크 다이나믹은 이렇게 고정된 호출 경로를 완전히 유연하게 만들어줘.🍳 비유: 요리사의 비법보통 요리사가 요리를 만들려면:**레시피(코드)**를 꺼내고,그걸 따라 만들어야 해.즉, 어..

Java 2024.12.12

파라미터 타입이 다른 공통 로직 모듈화 - 어댑터 패턴

그리고 다시 이어서 2024.12.11 - [Java] - 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스파라미터 타입이 달라 코드 중복이 발생하는 문제"를 인터페이스를 통해 해결하는 것을 간단한 예로 다시 정리해둔 것임...Animal 인터페이스를 활용하여 공통 로직을 모듈화하고,파라미터 타입99duuk.tistory.com 기존 코드를 수정하기 두렵거나.. 다양한 타입의 객체를 통합된 방식으로 처리해야 하는 상황이라면 어댑터 패턴 또한 고려해볼만할지도? (맞는지모름) 1. 어댑터 패턴의 기본 개념어댑터 패턴은 두 가지 시스템(또는 클래스)이 호환되지 않을 때,중간에 어댑터 클래스를 만들어 서로를 연결하는 디자인 패턴임이 패턴은 특정 인터페이스..

Java 2024.12.11

파라미터 타입이 다른 공통 로직 모듈화 - 정적 팩토리 메서드

2024.12.11 - [Java] - 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스2024.12.11 - [Java] - 파라미터 타입이 다른 공통 로직 모듈화 - 제네릭 파라미터 타입이 다른 공통 로직 모듈화 - 제네릭파라미터 타입이 다른 공통 로직 모듈화 -2024.12.11 - [Java] - 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스파라미터 타입이 달라 코99duuk.tistory.com다시 이어서 .. 2024.10.21 - [Java] - 정적 팩토리 메서드 정적 팩토리 메서드| 정적 팩토리 메서드는 객체를 만드는 특별한 방법임일반적인 생성자 대신, 클래스 안에 객체를 만드는 전용 메서드를 만들어 사용함.이 메서드는 이름..

Java 2024.12.11

파라미터 타입이 다른 공통 로직 모듈화 - 제네릭

파라미터 타입이 다른 공통 로직 모듈화 -2024.12.11 - [Java] - 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스 파라미터 타입이 다른 공통 로직 모듈화 - 인터페이스파라미터 타입이 달라 코드 중복이 발생하는 문제"를 인터페이스를 통해 해결하는 것을 간단한 예로 다시 정리해둔 것임...Animal 인터페이스를 활용하여 공통 로직을 모듈화하고,파라미터 타입99duuk.tistory.com 이어서..  모든 클래스가 공통 부모 클래스(Auth)를 상속받고 있을 경우,인터페이스 없이 제네릭을 활용해 공통 로직 처리 ..public class Dog extends Auth{ private String name; private int age; private String bree..

Java 2024.12.11