차근차근/JAVA JSP

extends(상속), implements(상속,구현),abstract(강제 상속..?),serializable(직렬화) -작성중

예쁜꽃이피었으면 2021. 12. 7. 11:59

extends

- 부모 클래스가 가진 메소드나 변수를 자식클래스에서도 그대로 물려받아 사용.

- extends는 자식클래스에서 사용해야 하고 하나의 부모클래스만 상속이 가능하다.

- extends를 사용할 수 있는 경우 

  1) class가 class를 상속할 경우

  2) interface가 interface를 상속할 경우

 


implements(interface구현)

- 부모객체에는 메소드나 변수를 선언만 하고 기능적 구현은 하지 않는다.

자식클래스에서는 선언만 된 메소드를 @override로 구현(implements)해주는 것을 말한다.

- 자바는 다중상속을 지원하기 않기 때문에 implements가 등장했다.

  implements는 다중상속을 대신해준다.

public class Son implements Father, Mother{...}

- 자식클래스에서 사용된 부모의 클래스는 반드시 @override를 통해 구현되어야만 한다.

 

 

 

extends 와 implements 정리 
- extends는 일반 클래스와 abatract클래스 상속에 사용되고, implement는 interface상속에 사용된다.
- class가 class를 상속받을 때는 extends를 사용, interface가 interface를 상속받을 때는 extends를 사용한다.
- class가 inteface를 사용할 때는 implements를 써야하고 interface가 class를 사용할때는 implements를 쓸 수 없다.
- extends는 클래스 한개만 상속받을 수 있다. (부모가 여러명은 아니니까.)
- extends 를 사용한 클래스는 부모 클래스의 기능을 이용한다.
- implements는 여러개 사용 가능하다.
- implements는 설계목적으로 구현 가능하다.
- implements한 클래스는 implements의 내용을 다 사용해야 한다.

- extends는 클래스를 확장하는 거고 implements는 인터페이스를 구현하는 것이다.
인터페이스와 보통 클래스의 차이는 인터페이스는 정의한 메소드를 구현하지 않아도 된다.
인터페이스를 상속받은 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다. 

abstract (추상 메소드)

- 상속을 강제하는 규제.. 즉, abstract클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제한다.

- 하위 클래스에서 반드시 부모 클래스의 메소드를 사용하도록 강제할 수 있는 클래스.

 


serializable(직렬화)

좋은글이라는데 나는 아직 어려워서..패스

https://j.mearie.org/post/122845365013/serialization

public interface Serializable {
}

- Serializable인터페이스를 구현하면 JVM에서 해당 객체는 저장하거나 다른 서버로 전송할 수 있도록 해준다.

1) 생성한 객체를 파일로 저장  / 저장한 객체를 읽거나 / 다른 서버에서 생성한 객체를 받거나.. 등의 일이 생기게 되는데 이 때 반드시 serializable인터페이스를 구현해야 한다.

- 직렬화란

1) 자바 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트(byte)형태로 데이터를 변환하는 기술과 byte로 변환되어 있는 데이터를 다시 객체로 변환하는 기술(역직렬화)을 아울러 말한다.

2) 시스템적으로 이야기하면 JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 같이 이야기 한다.

- 직렬화 조건

: 자바 기본(primitive)타입과 java.io.Serializable인터페이스를 상속받은 객체는 직렬화 할 수 있는 기본조건을 가짐

더보기

 

    package woowahan.blog.exam1;
    /**
    * 직렬 화할 회원 클래스
    */
    public class Member implements Serializable {
        private String name;
        private String email;
        private int age;

        public Member(String name, String email, int age) {
            this.name = name;
            this.email = email;
            this.age = age;
        }

        // Getter 생략

        @Override
        public String toString() {
            return String.format("Member", name, email, age);
        }
    }

 

- serialVersionUID 

값의 의미는 해당 객체의 버전을 명시하는 데 사용

만약 별도로 지정하지 않으면, 자바 소스가 컴파일될 때 자동으로 생긴다.

더보기

https://devlog-wjdrbs96.tistory.com/268

Serializable 인터페이스를 구현한 클래스들을 보면 serialVersionUID라는 값을 지정해주는 것을 본 적이 있을 것입니다.

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {

    private static final long serialVersionUID = 362498820763181265L;
}

예를들어, HashMap 클래스를 보면 위와 같은 변수를 볼 수 있습니다. 이렇게 Serializable 인터페이스를 구현한 후에는 위와 같이 serialVersionUID라는 값을 지정해 주는 것을 권장합니다.
(만약 별도로 지정하지 않으면, 자바 소스가 컴파일될 때 자동으로 생깁니다.)

static final long serialVersionUID = 1L;

위와 같이 반드시 static final long으로 선언해야 하며, 변수명도 serialVersionUID로 선언해 주어야 자바에서 인식을 할 수 있습니다.

 

 

그러면 이 값은 어디에 사용되고 어떤 값을 넣어야 할까요?

  • 값은 아무런 값이나 지정해주면 됩니다.

 

값의 의미는 해당 객체의 버전을 명시하는 데 사용합니다. 예를들어 보겠습니다.

 

A라는 서버에서 B라는 서버로 SerialDTO라는 클래스의 객체를 전송한다고 가정하겠습니다. 전송하는 A 서버에 SerialDTO라는 클래스가 있어야 하고, 전송받는 B 서버에는 SerialDTO라는 클래스가 있어야만 합니다.
그래야만 그 클래스의 객체임을 알고 데이터를 받을 수 있습니다.

그런데 만약 A 서버가 갖고 있는 SerialDTO에는 변수가 3개 있고, B 서버의 SerialDTO에는 변수가 4개 있는 상황이 발생하면 어떻게 될까요?
이러면 자바에서는 제대로 처리를 못하게 됩니다. 따라서 각 서버가 쉽게 해당 객체가 같은지 다른지를 확인할 수 있도록 하기 위해서는 serialVersionUID로 관리를 해주어야만 합니다.

즉 클래스 이름이 같더라도 이 ID가 다르면 다른 클래스라고 인식합니다. 게다가, 같은 UID라고 할지라도, 변수의 개수나 타입 등이 다르면 이 경우도 다른 클래스로 인식합니다.

 

 

 


 

[참조]

https://velog.io/@hkoo9329/%EC%9E%90%EB%B0%94-extends-implements-%EC%B0%A8%EC%9D%B4

 

자바 extends, implements 차이

상속이란 (Inheritance) 상속을 말하기 전에 먼저 OOP가 무엇인지 알면 좋을거 같다.OOP(Object-Oriented Programming, 객체 지향 프로그래밍) 이란? OOP의 특징으로 1. 상속과 인터페이스 (계층성) 2. 다형성, 사

velog.io

https://pinokio0702.tistory.com/140

 

[Java]extends와 implements

 요즘 인프런에서 spring-boot 개념과 핵심 기능에 대한 강의를 듣고 있습니다. 한창 배우는데... extends와 implement는 쓰는데,,, 왜 쓰는 건지... 어떤 때에 써야 하는지 생각이 나지 않아서... 이번 기

pinokio0702.tistory.com

https://xianeml.tistory.com/32

 

JAVA 자바 추상클래스 abstract

🎯 자바의 추상클래스를 알아본다. 추상클래스 "이 함수만은 반드시 자식에게 주겠다!" public abstract class 클래스명{ :인스턴스 변수 :일반 메소드 (concrete method) :생성자 :추상 메소드 (abstract met.

xianeml.tistory.com

https://velog.io/@gillog/Java-Interface-vs-Abstract-Class-%EC%A0%95%EB%A6%AC

 

[Java] Interface vs Abstract Class 정리

🙆‍♂️ 참고사이트 🙇‍♂️ 자바의 추상 클래스와 인터페이스 - 추상 클래스와 인터페이스의 차이[by강관우] [JAVA] 추상클래스 VS 인터페이스 왜 사용할까? 차이점, 예제로 확인 [마이자몽 myJ

velog.io

https://techblog.woowahan.com/2550/

 

자바 직렬화, 그것이 알고싶다. 훑어보기편 | 우아한형제들 기술블로그

{{item.name}} 자바의 직렬화 기술에 대한 대한 이야기입니다. 간단한 질문과 답변 형태로 자바 직렬화에 대한 간단한 설명과 직접 프로젝트를 진행하면서 겪은 경험에 대해 이야기해보려 합니다.

techblog.woowahan.com

https://devlog-wjdrbs96.tistory.com/268

 

[Java] 직렬화(Serialization)란 무엇일까?

Serializable에 대해서 알아보기 직렬화라는 용어에 대해서 들어만 보고 공부해본 적은 없는데 이번 기회에 정리를 하게 되었습니다,, 이번 글에서는 직렬화 에 대해서 알아보겠습니다. public interfac

devlog-wjdrbs96.tistory.com

 

반응형