JAVA

Posted by DavidEugen on June 13, 2022 · 3 mins read

JAVA

Interface

인터페이스 - g추상 메서드의 집합

추상 클래스 - 일반 클래스, 추상 메서드를 가지고 있는것

인터페이스 - 추상 메서드만 가지고 있는것 ( 구현 된것이 없는 껍데기 )

(예외 자바 8 이후 default, static method)

1) 변수 - 무조건 public static final 로 선언, 없어도 생략 된 것이다. 2) 추상 메소드 - 무조건 public abstract 로 선언, 없어도 생략 된 것이다. 3) default 메소드 : 인터페이스에서 기본적으로 제공하지만 구현 내용을 재구현 하고 있다면 오버라이딩이 선택적으로 가능 4) static 메소드 : 인터페이스에서 제공하는 것으로 무조건 사용해야 한다.

  • 인터페이스의 조상은 인터페이스만 가능 ( Object가 최고 조상이 아님)

  • 다중 상속이 가능( 구현 된 것이 없으므로, 충돌 문제가 없음)

Static

특징

  • static은 변수나 메소드에 키워드로 사용된다.
  • 클래스가 메모리에 올라갈 때 자동으로 생성이 된다.
    • 인스턴스 생성 없이 바로 사용가능
  • 인스턴스의 것이 아니라 클래스의 것이다.

Static의 사용

  • 설정 정보 등의 공용 정보

  • 매번 메모리에 로딩하거나 값을 읽어들이는 것보다 일종의 ‘전역변수’와 같은 개념을 통해서 접근하는 것이 비용도 줄이고 효율을 높일 수있다.

변수 종류 선언 위치 생성시기
class variable ( static ) 공통 공유 클래스 영역 클래스가 메모리에 올라갈때
instance variable 개별 클래스 영역 인스턴스 생성시
local variable 클래스 영역 이외
(메서드 생성자, 초기화 블럭)
변수 선언문이 수행될때

클래스 변수는 Method Area에

인스턴스 변수는 Heap 영역에

지역 변수는 call stack 영역에

static 붙을 수있는곳

대상 의미
멤버변수 - 모든 인스턴스엣 공통적으로 사용되는 클래스 변수
- 인스턴스 생성하지 않고도 사용 가능
- 클래스가 메모리에 로드될 때 생성
메서드 - 인스턴스를 생성하지 않고도 호출이 가능
- static 메서드 내에서는 인스턴스 멤버들(iv,im)을 직접 사용할 수 없다.(객체를 만들고 나야지 쓸 수 있으니깐.)

클래스 변수(static) 은 참조 변수로 써도 되지만, 클래스.변수 형태로 써야 한다.

Serialize

클라이언트 - 서버간 상호운영성은 두 가지로 구분될 수 있다.

  • 데이터가 어떻게 전송되는지 => HTTP
  • 무엇이 전송되는지 => 데이터를 표현하는 메서드

네트워크 통신에만 특정된 것은 아니다.

객체 직렬화 (Serialization) 는 JVM에서 자바 객체를 ‘내보내는’ 간단한 방법.

직렬화된 객체는 디스크에 기롤할 수 있고, 네트워크가 아닌 다른 I/O 인터페이스에 기록할 수도 있다.

  • 파일 시스템에서는 FileInputStream / FileOutputStream ( InputStream / OutputStream )
  • HTTP에서는 HttpServletRequest / HttpServletResponse
  • 자바 객체는 ObjectOuputStream / ObjectInputStream

Collection

Vector VS ArrayList

Vector : synchronized -> 1 thread만 접근 가능

ArrayList : 멀티스레드 가능

ArrayList

배열은 요소 추가시 O(n) : 새로 만들어야 하니깐

ArrayList 는 요소 추가시 O(1), 최악은 O(n) : 일정 크기의 배열을 만들어 놓는다. 리스트 요소가 일정 이상 많아지면 배열처럼 새로 만들어야 한다.

단, 특정 인덱스에 끼워 넣는것은 O(n)이다. 이는 마찬가지로 뒤로 한칸씩 미뤄 줘야 하니깐…

삭제는 바로 새로운 리스트가 만들어 지는것이 아니라, 일정 개수 삭제후 compaction을 한다. 이도 최악은 O(n) 이다.

LinkedList

인덱스 없다. 배열이 없다. 노드가 있다.

추가 및 삭제 시 O(1) : 단 특정 인덱스에 추가하는 것은 O(n) . 그 노드까지 찾아가서 (조회 후..) 추가해야 .

삭제는 개념적으로는 O(1)이지만 실질적 삭제는 O(n) 이다. 개념적 삭제는 Node만 지워 주면 되는 데, 내용물을 조회후 삭제를 해야 하므로 O(n)이다.

조회시 O(n) ( 순차적으로 next node를 따라간다.)