이펙티브 자바 Item 20을 읽으면서... "default 메서드에 equals와 hashCode, toString처럼 Object의 메서드를 재정의하지 말라"라는 문구가 있었습니다. 🤔 코드를 작성해보니..? 컴파일 에러가 발생한다..? 어라라..? 옛날에는 이게 가능했나보네 싶었고 왜 이제 컴파일 에러가 발생하는 걸까? 라는 궁금증이 생겼습니다. 혹은 똑똑한 intellij가 😎 만약 클래스 B는 의도적으로 Object 클래스를 구현하는 A 인터페이스를 구현할 수 있다면?? B는 Object 클래스와 Interface 중에서 어떤 equals를 사용해야 할까요..? (충돌이 일어날거 같다?) 찾아보니 이런 규칙이 있었다! 클래스는 항상 승리한다! 뭔가 멋있네요.. 명언같기도 하고 즉, 우선순위가 하..
Java
사이드 프로젝트를 진행하면서 무심하게 Objects.equals() 메서드를 사용했었고 코드 리뷰를 받으면서 파라미터 두개의 타입이 Enum이면 == 비교 연산자를 사용하는게 어떤지 질문 받았다.Objects.equals(newUser.getSocial(), existingUser.getSocial());파라미터값 두개를 동시에 비교하려고 Objects.equals()를 무심하게 사용했었다.NPE(NullPointerException)를 방지하는 목적으로 비교하기 위해서 사용했었는데 생각없이 사용한 자신을 반성하고 왜 == 비교 연산자에 대해서 이야기 하셨는지 Objects.equals(), enum의 equals(), == 비교 연산자에 대해서 Test 해보면서 알아보려고 한다. 테스트에서 사용하는 ..
JVM(Java Virtual Machine) 자바 가상 머신 JVM(Java Virtual Machine)은 자바 프로그램 실행환경을 만들어 주는 소프트웨어입니다. OS에 종속받지 않고 CPU가 Java를 인식하고 실행할 수 있게 하는 가상 컴퓨터라고 말합니다. Java Compiler가 .java 파일을 .class 파일 즉, 바이트 코드(JVM이 이해하는 명령어 집합)로 만들면 이 코드가 자바 가상 머신 환경에서 실행되면서 OS에 종속받지 않게 됩니다. 언어 마다 사용할 수 있는 방법은 다르겠지만 Java 뿐만 아니라 .class 파일을 통해서 JVM를 사용하는 언어들이 있습니다. Java Compiler의 javac 명령을 통해서 .class 파일을 생성할 수 있습니다. .class 파일을 ja..
var가 타입을 추론해 준다는 것은 알고 있었지만 부정적인 의견들이 많아 정적 언어인 자바에서는 자주 안 쓰는구나 하고 말았었는데 최근 코드 리뷰를 받으면서 이야기가 나오게 되었고 알고 안 쓰는 거랑 잘 모르는데 안 쓰는 건 차이가 있다고 생각이 들어 정리해 보고자 작성하게 되었습니다.지역 변수 타입 추론Java 10부터 지역 변수에 대한 Type Inference가 가능한 var 키워드를 제공해줍니다. var는 변수를 선언과 초기화가 동시에 일어날 때 타입을 생략할 수 있으며, 컴파일러가 타입을 추론합니다. 문자열 변수에 정수를 할당하니 컴파일 에러가 나오는것을 볼 수 있었습니다.컴파일 시점에 var에 들어갈 타입을 추론하고 바이트 코드에는 추론된 타입이 들어가기 때문에 런타임 오버헤드가 생기지 않습..
추상 클래스와 인터페이스는 존재 목적이 다르다. 추상 클래스: 자신을 상속받아서 기능을 이용하고 확장하는 용도 인터페이스: 함수의 구현을 강제하여 구현 객체의 같은 동작을 보장하는 용도 1. 클래스는 하나의 추상 클래스만 상속받을 수 있지만 인터페이스는 여러 개 구현할 수 있다. 즉 인터페이스는 여러개 구현할 수 있지만 java는 단일 상속만 허용하기 때문이다. 왜...? 단일 상속일까? 인터페이스의 목적은 함수의 구현을 강제한다고 했다. 즉 서로 다른 Interface에 같은 추상 메서드가 있을 때 Override가 필수이기 때문에 자신이 Override로 작성한 메서드가 호출이 될 것이다. public class Main extends A implements C, D { @Override public..