Java
-
자바 인터페이스와 추상클래스 차이점Java 2023. 10. 10. 19:20
* 인터페이스와 추상클래스는 추상 메소드를 통해 상속/구현을 통한 메소드 강제 구현 규칙을 가지는 추상화 클래스이다. 인터페이스와 추상클래스 공통점 new 연산자로 인스턴스 생성 불가능 사용하기 위해서는 하위 클래스에서 확장/구현이 필요 인터페이스와 추상클래스 차이점 가장 큰 차이점은 사용 목적에 중점을 두고 봐야한다. 인터페이스 다중상속이 가능 인터페이스를 구현하는 모든 클래스에 대해 특정한 메소드가 반드시 존재하도록 강제함 모든 메소드가 추상 메소드로만 이루어져 있는 것 implements라는 키워드처럼 인터페이스에 정의된 메서드를 각 클래스의 목적에 맞게 기능을 구현 추상클래스 다중상속이 불가능 상속받는 클래스들의 공통적인 로직을 추상화 시키고, 기능 확장을 위해 사용 클래스 내 추상 메소드가 하나..
-
자바 불변 객체와 final에 대한 개념Java 2023. 10. 9. 17:56
불변 객체(Immutable Object) 객체 생성 이후 내부의 상태가 변하지 않는 객체 read-only메소드만 제공하고, 내부 상태를 제공하는 메소드를 제공하지 않거나 방어적 복사를 통해 제공 방어적 복사 : 참조를 통해 값을 수정하면 내부의 상태가 변하기 때문에 내부를 복사하여 전달하는 것 불변 객체와 final을 사용하는 이유 Thread-Safe하여 병렬 프로그래밍에 유용하고 동기화를 고려하지 않아도 된다. 멀티 쓰레드 환경에서 공유자원을 동시에 쓰기(Write) 때문에 동기화 문제가 발생한다. 하지만, 공유 자원이 불변이라면 더 이상 동기화를 고려하지 않아도 된다. (항상 동일한 값을 반환하기 때문) 안정성을 보장하고 동기화를 하지 않아 성능상의 이점을 가져온다. 실패 원자적인 메소드를 만들..
-
자바 try-with-resources 알아보기Java 2023. 10. 9. 17:41
try-with-resources try(...)에서 선언된 객체들에 대해 try가 종료될 때 자동으로 자원을 해제해주는 기능 try에서 선언된 객체가 AutoCloseable을 구현하였다면 Java는 try구문이 종료될 때 객체의 close() 메소드를 호출 try-catch-finally와 비교 // IOException를 throws한다고 명시적으로 선언했기 때문에 close에 대한 try-catch 구문을 작성안함 public static void main(String args[]) throws IOException { FileInputStream is = null; BufferedInputStream bis = null; try { is = new FileInputStream("file.txt"..
-
자바 오버라이딩(Overriding)과 오버로딩(Overloading) 차이점Java 2023. 10. 9. 15:34
오버라이딩(Overriding)과 오버로딩(Overloading) 차이점에 대한 개요 공통점은 클래스의 인스턴스 멤버인 메소드를 재정의 또는 확장의 개념 Overriding 상위 클래스에 있는 메소드를 하위 클래스에서 재정의 하는 것 부모 클래스의 상속을 받은 자식 클래스에서 확장 Overloading 매개변수의 개수나 타입을 다르게 하여 같은 이름의 메소드를 여러 개 정의하는 것 하나의 클래스 내부에서 확장 오버라이딩(Overriding) 자식 클래스에서 물려 받은 메소드를 재정의하거나 기능을 추가 조건 메소드의 이름이 일치해야함 메소드의 매개변수의 개수, 순서, 데이터 타입이 일치해야함 메소드의 return타입이 일치해야함 class Car { int speed = 0; public int setSp..
-
자바 직렬화 & 역직렬화(4)_문제점Java 2023. 10. 9. 15:19
자바 직렬화 문제점 용량이 크다 JSON으로 저장하는 것보다 2배 이상 차이가 난다. DB, 캐시 등에 외부에 저장할 때, 장기간 저장하는 정보는 직렬화를 피해야한다. 역직력화는 위험하다. 다른 사람이 만든 것을 역직렬화 하는 과정에서 공격당할 위험이 있다. 신뢰할 수 없는 데이터는 절대 역직렬화 하면 안되며, 직렬화의 잠재적인 위험성을 회피하는 가장 좋은 방법은 아무것도 역직렬화하지 않는 것이다. 릴리즈 후 수정이 어렵다 클래스의 내부 구현을 수정한다면 원래의 직렬화 형태와 달라지게 되기 때문이다. 새로운 버전을 릴리즈할 때 테스트 요소가 많아진다 클래스 캡슐화가 깨진다. 직렬화할 클래스에 private 멤버가 있어도 직렬화를 하게 되면 그대로 외부로 노출되게 된다. 버그와 보안에 취약하다 상속용 클래..
-
자바 직렬화 & 역직렬화(3)_버전 관리Java 2023. 10. 9. 13:49
직렬화 버전 관리 Serializable 인터페이스를 구현하는 모든 직렬화된 클래스는 serialVersionUID(이하 SUID) 이라는 고유 식별번호를 부여 받는다 식별 ID는 클래스를 직렬화, 역직렬화 과정에서 동일한 특성을 갖는지 확인하는데 사용 클래스 내부 구성이 수정될 경우, 기존에 직렬화한 SUID와 현재 클래스의 SUID 버전이 다르기 때문에 이를 인지하고 InvalidClassException 예외가 발생시켜 값 불일치 되는 현상을 미연에 방지한다. 클래스에 SUID 필드를 명시하지 않는다면, 시스템이 런타임에 클래스의 이름, 생성자 등과 같이 클래스의 구조를 이용해 암호 해시함수를 적용해 자동으로 클래스 안에 생성하게 된다. 직렬화 버전 수동 관리 직렬화 클래스는 왠만한 상황에선 ser..
-
자바 직렬화 & 역직렬화(2)_사용법Java 2023. 10. 9. 13:40
직렬화 사용 여러개의 객체를 역직렬화 할 때, 직렬화할때 순서와 일치해야 한다. 부모-자식 상속 관계에서 부모 클래스가 Serializable을 구현했다면 자식 클래스는 Serializable을 구현하지 않아도 직렬화가 가능하다. 부모 클래스는 Serializable을 구현하지 않고 자식 클래스만 구현했다면 직렬화할때 부모 클래스의 인스턴스 필드는 무시되고 자식 필드만 직렬화가 된다. 상위 클래스의 필드까지 직렬화하려면 부모 클래스가 Serializable을 구현하도록 설정 객체를 직렬화하기 위해선 java.io.Serializable 인터페이스를 implements 해야 된다. 그렇지 않으면 NotSerializableException 런타임 예외가 발생된다. import java.io.Serializ..
-
자바 직렬화 & 역직렬화(1)_기본 지식Java 2023. 10. 8. 21:15
직렬화 자바의 Object, Data를 다른 컴퓨터의 자바 시스템에서도 사용할 수 있도록 바이트 스트림 형태로 연속적인 데이터로 변환하는 포맷 변환 기술 역직렬화는 반대의 의미를 가진다. 바이트 스트림 : 스트림은 클라이언트나 서버 간에 출발지 목적지로 입출력하기 위한 데이터가 흐르는 통로를 말한다. 자바는 스트림의 기본 단위를 바이트로 두고 있기 때문에, 네트워크, 데이터베이스로 전송하기 위해 최소 단위인 바이트 스트림으로 변환하여 처리한다. 직렬화의 응용 * 휘발성이 있는 캐싱 데이터를 영구 저장이 필요할때 사용 서블릿 세션 단순히 세션을 서블릿 메모리 위에서 운용한다면 직렬화를 필요로 하지 않지만, 만일 세션 데이터를 저장 & 공유가 필요할때 직렬화를 이용한다. 캐시 데이터베이스로부터 조회한 객체 ..