자바에서 가장 최상위 클래스는 Object 클래스다.간단한 예제를 알아보자.클래스에서 상속받을 부모 클래스가 없다면 묵시적으로 Object 클래스를 상속 받는다.즉, 자바가 extends Object를 붙여준다.생략을 권장한다.묵시적개발자가 직접 코드를 적지 않더라도
Object 클래스는 모든 클래스의 부모 클래스이다.따라서 모든 객체를 참조할 수 있다.Object 클래스는 모든 객체의 부모이다.따라서, 어떤 객체든지 언제든지 인자로 전달 할 수 있다.action() 메서드 안에 obj를 호출하면 컴파일 에러가 발생한다.매개변수인
Object는 모든 타입의 객체를 담을 수 있다.따라서, Object\[]을 모든 참조 타입(Object를 상속한 객체)를 담을 수 있다.Object 타입의 배열은 세상의 모든 객체를 담을 수 있기 때문에, 어떤 새로운 클래스가 추가되어도 Object를 받는 구조는 변
Java의 Object 클래스에는 toString() 메서드가 정의되어 있으며,기본적으로 객체의 정보를 문자열 형태로 반환한다.이 메서드는 디버깅이나 로깅 과정에서 객체 상태를 확인할 때 유용하게 사용된다.추가로, Object 클래스에 정의 되므로 모든 클래스에서 상속
만약 Object에서 제공하는 toString()이 없다면 객체의 정보를 출력하는데 어려움이 있을 수 있다.예를 들면 클래스 별로 별도의 출력부가 필요하다.이렇게 BadObjectPrinter 클래스가 구체적인 Dog, Cat을 사용한다.이것을 BadObjectPrin
Object에서는 동등성 비교를 위한 equals() 메서드를 지원한다.자바에서는 같다라는 표현을 두가지로 나타낼 수 있다.동일성(Identity): == 연산자를 사용하여 두 객체의 참조값을 비교동등성(Equality): equals() 메서드를 사용하여 두 객체가
equals() 는 Object 타입을 매개변수로 사용한다.따라서 객체의 특정 값을 사용하려면 다운캐스팅이 필요하다.문자열 비교는 ==이 아니라 equals()를 사용해야 한다.위에 상기한 equals()는 매우 간단한 버전이고 실제로는 더욱 복잡한 코드로 작성을 해야
공유하면 안되는 객체를 공유하고, 그 값을 변경하면 다른 객체도 값이 변경되어 버린다.그런데, 사이드 이펙트의 원인을 생각해보면 객체를 공유하는 것 자체가 문제가 되지는 않는다.다만, 직접적인 원인은 공유된 객체의 값을 변경했기 때문이다.현재 a와 b는 같은 인스턴스를
사이드 이펙트가 발생해서 B의 주소를 변경할 시에, A의 주소도 같이 변경된다.변경이 불가능한 Immutable 클래스를 사용하고 있다.회원 B의 주소를 변경하려고 한다.하지만, ImmutableAddress는 값을 변경할 수 있는 메서드가 없다.따라서 새로운 Addr
자바에서 대표적으로 문자를 다룰 수 있는 타입은 char, String이 있다.기본형인 char는 문자 하나를 다룰 때 사용한다.하지만 char\[]처럼 직접 다루는 방법은 매우 불편하기 때문에 자바는 문자열을 편리하게 다룰 수 있는 String을 제공하고 있다.쌍따옴
String 클래스는 == 비교가 아니라 항상 equals()를 사용해서 비교를 해야한다.str1, str2는 new String()을 사용해서 인스턴스를 생성했다.서로 다른 인스턴스이기에 ==은 실패한다.둘은 내부에 같은 "hello"를 가지고 있기에 eqauls()
불변인 String 클래스도 단점이 있다.불변인 String 클래스의 단점은 문자를 더하거나 변경할 경우 새로운 객체를 만들어야 한다는 것이다.문자를 더 자주 변경해야할 경우 더 많은 String 객체를 만들어야 하고, GC해야 한다.결과적으로 컴퓨터가 더 많은 메모리
String은 불변객체다.String.concat()을 이용하면 기존 문자열에 새로운 문자열을 합칠 수 있다.이럴 경우 어떤 실행 결과가 나올까?전혀 합쳐지지 않았다. 이 이유에 관해 알아보자.String은 불변객체이기 때문에 변경이 필요한 경우 기존값을 변경하지 않고
래퍼 클래스는 기본형을 객체로 감싸서 관리하기 편하게 만들어준다.쉽게 이야기 하면 래퍼 클래스는 기본형을 객체로 만든 것이다.기본형을 래퍼 클래스로 변경하는 것을 마치 박스에 넣는 것 같다고 하여 박싱이라 한다.new Integer()는 Java 9부터 deprecat
자바에서 Class 클래스는 클래스의 정보(메타데이터)를 다루는데 사용된다.개발자는 실행중인 자바 어플리케이션 내에 필요한 클래스의 속성, 메서드에 관한 정보를 조회하고 조작할 수 있다.타입 정보 얻기: 클래스 이름, 슈퍼클래스, 인터페이스 등의 정보 조회를 할 수 있
자바가 제공하는 열거형(Enum)에 관해 알기 위해서 먼저 그 배경을 알아야한다.등급에 따라 할인을 해주는 로직이 있다고 해보자.다만, 현재 실행 클래스의 문자열은 제대로 입력 되지 않았다.단순히 문자열을 입력하는 방식은 오타가 발생하기 쉽고, 유효하지 않은 값을 입력
지금까지 설명한 문제를 해결하기 위해서 타입 안정 열거형 패턴이다.타입 안정 열거형 패턴을 사용하면 나열한 항목만 사용 할 수 있다는 점이 특징이다.각각 상수마다 별도의 인스턴스를 생성하고, 생성한 인스턴스를 대입한다.상수로 선언하기 위해 static, final을 사
자바는 타입 안전 열거형 패턴을 매우 간단하게 이용할 수 있도록 enum을 제공하고 있다.자바의 enum은 타입 안정성을 제공하고, 코드의 가독성을 높이며, 예상 가능한 값들의 집합으로 표현하는데 사용된다.열거형을 사용할 때 class가 아닌 enum을 작성하자원하는
모든 열거형은 java.lang.Enum을 상속 받는다.따라서 해당 클래스가 지원하는 다양한 메서드를 사용할 수 있다.values(): 모든 ENUM 상수를 포함하는 배열을 반환한다.valueOf(String name): 주어진 이름과 일치하는 ENUM 상수를 반환한다
가장 기본이 되는 날짜와 시간 클래스는 LocalDate, LocalTime, LocalDateTime이 있다.LocalDate: 날짜만 표현할 때 사용한다.LocalTime: 시간만 표현할 때 사용한다.LocalDateTime: 날짜와 시간 모두 표현할 때 사용한다.
시간의 간격은 2가지로 표기할 수 있다.두 날짜 사이의 간격을 년, 월, 일로 표기한다.getYear(), getMonth(), getDays()두 날짜 사이의 간격을 시, 분, 초로 표기한다.toHours(), toMinutes(), getSeconds(), getN
예외처리가 필요한 이유를 알기 전에 간단하게 프로그램을 만들어보자.이 프로그램은 사용자에게 입력을 받고, 입력 받은 문자를 외부로 전송하는 프로그램이다.Main은 사용자에게 문자열을 입력받아 NetworkService에 전달한다.NetworkService는 Networ
외부 서버와 통신할 때는 다양한 문제가 발생할 수 있다.서버 연결 실패데이터 전송 실패현재는 실제 서버와 통신하지 않으므로, 특정 문자열을 입력했을 때 오류가 발생하는 상황을 가정하여 구현하였다.연결 실패: 사용자가 "error1"이라는 메세지를 입력했을 경우, 오류코
NetworkService는 NetworkClient를 사용하는 전체 흐름을 관리한다.오류가 발생한 경우 오류 코드를 출력한다.connect()가 실패한 경우 send()를 호출하면 안된다.사용 후에는 반드시 disconnect()를 호출해야 한다.자바의 경우 GC가
자바에서는 프로그램이 실행 도중에 예상치 못한 예외를 처리하기 위한 매커니즘을 제공한다.이는 프로그램의 안정성과 신뢰성을 높이는데 중요하다.Object: 자바에서 기본형을 제외한 모든 것은 객체다.Throwable: 최상위 예외, 하위에 exception과 error가
Exception과 하위 예외는 모두 컴파일러가 체크하는 체크 예외다.체크 예외는 잡아서 처리하거나, 밖으로 던지도록 선언해야한다.안 그러면 컴파일 오류가 발생한다.예외클래스를 만들려면 예외를 상속받으면 된다.Exception을 상속 받은 예외는 체크 예외가 된다.th
언체크 예외는 말 그대로 컴파일러가 예외 처리 여부를 검사하지 않는 예외이다.언체크 예외도 체크 예외와 동일하게 try-catch로 처리할 수 있다.차이점은 예외를 처리하지 않을 경우 throws 선언을 생략할 수 있다는 점이다.즉, 예외를 잡지 않으면 자동으로 상위
대부분의 프로그래밍 언어는 제네릭(Generic)을 제공한다.먼저 제네릭이 왜 필요한지 예제를 통해 알아보자.코드를 보면 숫자를 보관하는 IntegerBox를 만들고 그곳에 값을 보관했다.또, 문자를 보관하는 StringBox를 만들고 문자열을 보관하였다.하지만 새로운
Object는 모든 부모 클래스다. 따라서 다형성을 참조하면 이전에 다룬 문제를 해결할 수 있을 것이다. 내부에 Object value를 가지고 있다. Object는 자식을 담을 수 있으므로 모든타입의 objectBOX를 담을 수 있다.
제네릭을 사용하면 타입 안정성과 코드 재사용성의 두가지 장점을 한번에 잡을 수 있다.<> 을 사용한 클래스를 제네릭 클래스라고 한다.제네릭을 사용할 때는 미리 타입을 정하지 않는다.여기서 T를 타입 매개변수라고 부른다.타입 매개변수는 Integer, String
제네릭의 핵심은 사용할 타입을 미리 정하지 않는다는 점이다.제네릭의 핵심은 사용할 타입을 미리 정하지 않고, 객체를 생성하는 시점에 타입을 결정하는 것이다.클래스 내부에서 사용하는 타입을 클래스를 정의하는 시점에 결정하는 것이 아니라, 실제 사용하는 생성 시점에 타입을
제네릭은 타입을 미리 정하지 않고 객체를 생성하는 시점에 결정할 수 있다.제네릭은 특정한 타입 구분 없이 이용가능하다.제네릭 타입 T의 범위를 알 수 없기 때문에 컴파일러는 T를 Object처럼 취급한다.따라서 Object가 제공하는 메서드만 사용할 수 있다.자바 컴파
자바에서는 제네릭을 좀 더 간편하게 이용할 수 있도록 와일드카드를 지원하고 있다.참고로 와일드카드는 프로그래밍에서 ?, \* 과 같은 하나 이상의 특수문자를 말한다.와일드카드는 "구체적인 타입은 모르지만 어떤 타입인지는 상관없다"는 의미로 사용된다.제네릭 메서드는 타입
제네릭 메서드와 마찬가지로 와일드 카드도 상한 제한을 둘 수 있다.만약 다른 타입이 들어오면 컴파일 에러가 발생한다.결과적으로 Animal의 기능을 호출할 수 있다.와일드 카드는 제네릭을 정의할 때 사용하는 것이 아니다.타입인자가 전달된 제네릭 타입을 활용할 때 사용한