expected webhook response of admission.k8s.io/v1, Kind=AdmissionReview, got /, Kind=

 

  • 에러 내용

expected webhook response of admission.k8s.io/v1, Kind=AdmissionReview, got /, Kind=

 

  • 에러 원인

admission 의 webhook 응답이 기대한것과 다름.

나는 v1을 요청했으나 응답이 v1으로 오지 않았다는 것.

 

  • 해결

v1beta1은 따로 응답에 kind나 apiversion 을 기술하지 않아도 됬었는데

v1부터는 kind와 apiversion을 응답에 같이 넣어주면 된다.

 

	requestedAdmissionReview := v1.AdmissionReview{}
	responseAdmissionReview := v1.AdmissionReview{}

	if _, _, err := deserializer.Decode(body, nil, &requestedAdmissionReview); err != nil {
		level.Warn(a.logger).Log("msg", "Unable to deserialize request", "err", err)
		responseAdmissionReview.Response = toAdmissionResponseFailure("Unable to deserialize request", []error{err})
	} else {
		responseAdmissionReview.Response = admit(requestedAdmissionReview)
	}

	responseAdmissionReview.Response.UID = requestedAdmissionReview.Request.UID
	responseAdmissionReview.APIVersion = requestedAdmissionReview.APIVersion
	responseAdmissionReview.Kind = requestedAdmissionReview.Kind

	respBytes, err := json.Marshal(responseAdmissionReview)
  • 소스 출처 prometheus-operator github

 

 

학습할 것 (필수)

  • Thread 클래스와 Runnable 인터페이스
  • 쓰레드의 상태
  • 쓰레드의 우선순위
  • Main 쓰레드
  • 동기화
  • 데드락

Thread 클래스와 Runnable 인터페이스

프로세스와 쓰레드

프로세스

  • 프로그램을 실행하면 OS로 부터 실행에 필요한 메모리를 할당받아 프로세스가 된다.
  • 이 프로그램을 실행하는데 필요한 데이터와 메모리등의 자원 그리고 쓰레드로 구성되어 있다.
  • 모든 프로세스에는 한개이상의 쓰레드가 존재한다.
  • 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스라고 칭함.

쓰레드

  • 프로세스 내에서 작업을 수행하는 역할

쓰레드를 구현하는 방법 중 두가지

Thread 클래스를 상속

class TestThread1 extends Thread { public void run() { //내용 } } thread 클래스를 상속받아 run을 오버라이딩하여 구현함.

Runnable 인터페이스를 구현

class TestThread2 implements Runnable { public void run() { //내용 } } Runnable 인터페이스의 run을 구현함.

두가지 방식의 차이점

  1. 인스턴스의 생성법이 다르다.

    TestThread1 thread = new TestThread1(); // Thread 클래스를 상속받았을 경우 Runnable r = new TestThread2(); Thread t = new Thread(r); // Runnable 인터페이스를 구현한 경우
  2. 호출이 다르다.

    • Thread클래스를 상속받으면 서브클래스에서 슈퍼클래스의 메소드를 직접 호출가능
    • Runnable을 구현할 경우 static 메소드인 currentThread()를 호출하여 쓰레드의 참조를 가져와야 호출이 가능함.

쓰레드의 상태

  1. NEW
    • 아직 thread가 생성은 됬지만 실행되지 않은 상태.
  2. RUNNABLE
    • jvm이 thread를 실행중인 상태
    • 실행중이므로 CPU에서 자원을 할당받은 상태이고
    • 운영체제의 자원 분배로 인해 WAITING 상태가 될수 있다.
  3. BLOCKED
    • Monitor를 획득하기 위해 다른 스레드가 락을 해제하기를 기다리는 상태
    • Java thread 동기화 모델은 모니터란 개념을 적용 중이다.
    • 모니터는 하나의 데이터 ( 객체 ) 마다 하나의 모니터를 결합 할수 있으며
    • 그것이 결합된 데이터 가 동시에 두개 이상의 스레드에 의해 접근할수 없도록 막는 락을 제공함
    • 결국 BLOCKED 상태는 다른사용자가 사용하고 있는 데이터를 사용하기위해 기다리고 있는 상태
  4. WAITING
    • 다른 스레드가 특정 작업을 수행할떄까지 무기한으로 대기중인 상태
    • wait() , join() , park() 메소드 등을 이용해 대기중임.
  5. TIMED_WATING
    • 다른 스레드가 지정된 대기 시간까지 작업을 수행하기를 기다리는 상태
    • sleep() , wait(), join(), park() 메소드등을 사용해 대기중인 상태
    • WAITING 상태와의 차이점은 메서드의 인수로 최대 대기 시간을 명시할 수 있어 외부적인 변화뿐만 아니라 시간에 의해서도 WAITING 상태가 해제될 수 있다는 것
    • 출처 d2.naver
  6. TERMINATED
    • 스레드가 종료된 상태

쓰레드의 우선순위

  • 쓰레드는 우선순위라는 속성 ( 멤버변수) 를 가지고 있는데 이 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
  • 쓰레드가 수행하는 작업의 중요도에 따라 우선순위를 서로 다르게 지정하여 특정 쓰레드가 더 많은 작업시간을 갖게 할수 있다.
  • setPriority 메소드로 우선순위를 지정할수 있음.
  • getPriority로 우선순위를 반환함.

메인 쓰레드

  • main 메소드에서 작업을 수행하는 것
  • main 메소드를 실행시 jvm에서 돌아가게 되며 이때 jvm은 프로세스가 되어 운영체제로 부터 자원을 할당받고 쓰레드가 실행되는데 이떄 main 메소드에서 실행하는게 main 쓰레드다.

데몬 쓰레드

  • 다른 일반 쓰레드의 작업을 돕는 보조적인 역할의 쓰레드
  • 일반 쓰레드가 모두 죵로되면 같이 종료된다.
  • setDaemon 메소드로 유저 쓰레드가 될지 데몬 쓰레드가 될지 정할수 있다.

동기화

  • 멀티쓰레드를 사용하는 경우 하나의 데이터를 사용하려고 할때 다른 쓰레드가 접근하지 못하게 막는 것.

public synchronized void test() { } // 메소드 전체를 임계 영역으로 지정 public void test() { synchronized() { } } // 특정 지역을 임계 영역으로 지정

주의점

  • 임계영역은 작을수록 좋음.
    • 임계영역이 클수록 어떤 오류가 발생할지 모르기 때문.
  • 임계영역은 최소한으로 줄여야함
    • 임계영역이 여러곳일 경우 A 쓰레드에서는 통과가 안될 로직이 B 쓰레드가 작동함으로써 통과되는 버그가 일어날수도 있기 떄문.

데드락

  • 두개 이상의 스레드에서 작업을 완료하기 위해 상대의 작업이 끝나기를 기다리는 상황

  • 쓰레드 A가 작업을 계속 하려면 쓰레드 B의 작업이 끝나기를 기다려야 하고

  • 쓰레드 B가 작업을 계속 하라면 쓰레드 A의 작업이 끝나기를 기다려야 하는 상황.

  • 어느 한쪽이 자신의 락을 해제하기 전까지는 데드락 상태는 해제되지 않는다.

참조

'백선생님 온라인스터디' 카테고리의 다른 글

13주차 I/O  (0) 2021.03.01
12주차 애노테이션  (0) 2021.02.28
11주차 Enum  (0) 2021.01.30
9주차 - 예외 처리  (0) 2021.01.19
8주차 - 인터페이스  (0) 2021.01.16

목표

자바의 열거형에 대해 학습하세요.

학습할 것 (필수)

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet

Enum 정의하는 방법

enum Myenum { FIRST, SECOND, THIRD }

멤버 추가하는 방법

enum Myenum { FIRST(1), SECOND(2), THIRD(3); private finla int value; Myenum(int value) { this.value = value; } }

  • 멤버 추가시 지정된 값을 저장할수 있는 인스턴스 변수와 생성자를 추가해줘야 한다.

추상메소드 추가하는 방법

enum Myenum { FIRST(1) { int add10(int value) { return value+10 } }, SECOND(2){ int add10(int value) { return value+10 } }, THIRD(3){ int add10(int value) { return value+10 } }; private finla int value; Myenum(int value) { this.value = value; } abstract int add10(int value); protected final int MY_VALUE; }

Enum이 제공하는 메소드 (values()와 valueOf())

  • values()
    • 이 메소드는 해당 enum의 모든 상수를 배열 형태로 반환한다.
  • valueOf()
    • 이 메소드는 enumType과 String을 매개변수로 받으며
    • String과 일치하는 enum의 상수를 반환한다.

java.lang.enum

  • 모든 열거형의 조상
  • values() 메소드는 모든 열거형이 가지고 있는 것으로 컴파일러가 자동으로 추가해 준다.
  • valueOf 역시 컴파일러가 자동으로 추가해준다.

그 외 enum class에 정의된 메소드들

  • Class<E> getDeclaringClass()
    • 열거형의 Class 객체를 반환
  • String name()
    • 열거형 상수의 이름을 문자열로 반환
  • int ordinal()
    • 열거형 상수가 정의된 순서를 반환 ( 0부터 시작)
  • T valueOf(Class<T> enumType, String name)
    • 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

EnumSet

  • EnumSet은 enum 클래스와 함께 작동하는 특수 Set 컬렉션입니다.
  • Set 인터페이스를 구현하고 AbstractSet에서 확장됩니다.

 

이미지 출처 : https://www.baeldung.com/java-enumset

  • EnumSet은 instance를 만드는 메소드를 제외하고는 다른 Set처럼 작동합니다.

EnumSet.allOf(Color.class); //Color 열거형의 모든 요소를 포함 EnumSet.noneOf(Color.class); //빈 Color 열거형 컬렉션

EnumSet의 고려사항

  1. 열거형 값만 포함 가능하다.
  2. Null을 추가할수 없다.
  3. Thread-safe 하지 않다.
  4. 열거형에 선언된 순서에 맞게 저장됩니다.
  5. EnumSet의 iterator은 ConcurrentModificationException예외를 던지지 않습니다.

출처

https://www.baeldung.com/java-enumset

자바의정석

https://docs.oracle.com/javase/8/docs/api/java/util/EnumSet.html

'백선생님 온라인스터디' 카테고리의 다른 글

12주차 애노테이션  (0) 2021.02.28
10주차 멀티스레드 프로그래밍  (0) 2021.01.31
9주차 - 예외 처리  (0) 2021.01.19
8주차 - 인터페이스  (0) 2021.01.16
7주차 - 패키지  (0) 2021.01.12

블랙커피 블로그 스터디 3기를 시작하는 김에 뭐를 올릴까 고민을 했었습니다.

그렇게 고민하다가

"쿠버네티스를 점점 까먹고 있으니 복습을 해보자"

라고 마음먹고 쿠버네티스 관련 글을 적어보자고 결심했습니다.

저는 처음 쿠버네티스를 공부할때 클러스터의 기본구성을 먼저 공부하고

기본구성을 바탕으로 세세하게 공부했을때 효과가 꽤 괜찮았던 경험이 있어서

복습도 처음학습과 동일하게 가져갈 생각으로 클러스터의 구성을 먼저 복습하게 되었습니다.

쿠버네티스의 클러스터 구성

 

크게 쿠버네티스의 클러스터는 마스터노드 ( Control Plane ) 과 워커 노드 들로 이루어져 있습니다.

컨트롤 플레인

일명 마스터노드 라고 불리는 컨트롤 플레인입니다.

API Server와 Etcd , Scheduler , Controller manager 로 이루어져 있습니다.

보통 3대, 5대 구성을 많이합니다.

API Server

API Server가 제공하는 api를 이용하여 컨트롤 플레인과 워커 노드들은

이 api를 사용하여 서로가 통신할수 있게 됩니다.

ETCD

모든 클러스터 내의 정보를 담고 있는 저장소 입니다.

클러스터의 상태나 설정 정보를 저장하며 키 밸류 형태로 이루어져 있습니다.

스케줄러

리소스 생성시 노드에 알맞게 할당을 해주는 역할을 합니다.

컨트롤러 매니저

컨트롤러를 생성하고 이를 각 노드에 배포하며 관리하는 역할을 합니다.

컨트롤러

클러스터의 상태를 읽고 어떠한 작업을 실행하는 역할입니다.

노드

kublet과 kube-proxy , container-runtime 으로 이루어져 있습니다.

kubulet

클러스터의 각 노드에서 실행되는 에이전트로 API 서버와 통신을 하면서

노드의 상태를 전달하거나 마스터 노드로부터 명령을 받아 작업을 수행하는 역할입니다.

kube-proxy

클러스터의 각 노드에서 실행되는 네트워크 프록시로서 역할을 수행합니다.

userspace, iptables, ipvs, kernelspace 모드가 존재하며 현재는 iptables를 사용합니다.

Container Runtime

컨테이너를 실행을 담당하는 소프트웨어입니다.

대표적으로 Docker, containerd, CRI-O가 있으며 Docker는 1.23버전부터 제거될 예정입니다.

'개발 > Kubernetes' 카테고리의 다른 글

왜 apiversion이 변경되어 있을까  (0) 2021.06.11
컨테이너 런타임  (0) 2021.03.07
Mutating Webhook 를 이용한 pod injection  (0) 2021.02.16
k8s 에서 spring boot jib image command 수정  (0) 2020.12.24
클러스터 구성  (0) 2020.09.13

명령어

  • git init

    • 이 폴더를 git이 관리를 할수 있게 지정하는 명령어
    • 가장 먼저 쳐야됨
  • git add

    • 이 파일을 git이 관리하게 지정하는 명령어
    • git add 파일명 치면 관리되고
    • git add 폴더명 쳐도 관리되고
    • git add . 치면 현재 폴더 부터 하위의 모든 파일폴더 다 관리됨.
  • git rm

    • git rm —cached 파일명 치면 관리에서 해제됨.
    • git rm —rf 폴더명 치면 입력된 폴더의 하위 파일들이 관리에서 해제됨
  • LF , CR , CRLF

    • 윈도우 = CRLF
    • 맥 = LF
    • 줄바꿈이 os마다 다름
  • git commit

    • git commit 만 치면 vim형태로 commit message를 적을 수 있음.
    • git commit -m "메세지" 치면 메세지로 커밋됨.
    • -a 옵션 사용시 add가 자동으로 됨.
    • -am = -a + -m
    • git commit 파일명 파일명 -m "message"
      • 위 명령어로 여러개나 하나의 파일을 커밋할수 있음
    • 커밋이 됬으면 되돌릴 방법은 reset 뿐 revert는 삭제기록이 남는다.
  • git config —global

    • 이 명령어 뒤에 user.email 이나 user.name을 쳐서 email이나 name을 설정할수 있다.
    • 예) git config —global user.email "aaa@.naver.com"
  • git log

    • commit 내역을 볼수 있음.
    • 내역이 많아지면 vim editor이 켜진다.
  • git shortlog

    • commit 내역이 짧게 나옴.
  • git checkout — 파일명

    • 예) git checkout — 코드1.txt
    • 커밋하기전 변경된 파일을 원복 시킨다.
  • git diff

    • 변경된 점 확인.
  • git remote add 이름 주소

    • 예) git remote add origin https://github.com/abcdsds/practice-git
    • 저 주소로 origin 이란 이름으로 push 했을때 저장될 주소를 등록
    • git remote get-url origin
    • 오리진이란 이름으로 등록된 remote 주소를 가져옴
  • git branch -M main

    • master branch 의 이름을 main으로 변경
  • git push -u origin main

    • 깃을 푸시함 origin이란 이름으로 main branch를
    • 그럼 remote에서 등록한 주소로 전송됨.
  • git reset [option] HEAD~1

    • HEAD 는 현재
    • ~1은 현재에서 하나뒤로
    • 그럼 현재만 없어짐.
    • option 은
      • soft
      • mixed
      • hard 가 있고
      • soft는 add된 상태 ( 생성한 파일은 untracked 상태가 된다. = mixed한것과 같은 상태)
      • mixed는 add되지 않은 상태
      • hard는 기존커밋된 상태 ( 아예 변경되지 않은상태 )
      • default는 mixed
  • git revert

    • reset 처럼 되돌아가는데 이력이 남아있음.
    • 이력 삭제를 안함.
    • 푸쉬 까지 해서 오리진한테까지 가버린 경우 실수가 모든 팀원들한테 퍼져버린 경우
    • 혼자만 reset으로 삭제한다고 해결되는게 아님.
    • 결국 revert를 쓰면 이력이 남아있지만 다른사람껏도 수정이 되서 해결이 됨.

목표

자바의 예외 처리에 대해 학습하세요.

학습할 것 (필수)

  • 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)
  • 자바가 제공하는 예외 계층 구조
  • Exception과 Error의 차이는?
  • RuntimeException과 RE가 아닌 것의 차이는?
  • 커스텀한 예외 만드는 방법

java에서 예외를 처리하는 방법.

try { 로직 } catch (Exception e) { 로직을 돌다 오류 발생시 이 scope로 옴 } finally { 마지막 작업 } try catch구문을 생략하고 메소드 옆에 throws exception 을 붙이면 생략 가능함. throw new Exception으로 새로운 익셉션을 로직에서 호출할수 있음. catch (RuntimeException | IoException e) { } 이런식으로 멀티캐치를 사용할수 있다. 다만 주의할점은 사용하는 익셉션들이 서로 상속관계에 있으면 안된다는 것이다. try with resources try (SomeResource resource = getResource()) { // 로직 } catch (Exception e) { } try에 객체를 전달하면 try 코드 블록이 끝나면 자동으로 종료해줌

Java가 제공하는 예외 계층 구조

최상위에 Exception 이 존재하고

그 아래에 subclass 로는

AclNotFoundException, ActivationException, AlreadyBoundException, ApplicationException, AWTException, BackingStoreException, BadAttributeValueExpException, BadBinaryOpValueExpException, BadLocationException, BadStringOperationException, BrokenBarrierException, CertificateException, CloneNotSupportedException, DataFormatException, DatatypeConfigurationException, DestroyFailedException, ExecutionException, ExpandVetoException, FontFormatException, GeneralSecurityException, GSSException, IllegalClassFormatException, InterruptedException, IntrospectionException, InvalidApplicationException, InvalidMidiDataException, InvalidPreferencesFormatException, InvalidTargetObjectTypeException, IOException, JAXBException, JMException, KeySelectorException, LambdaConversionException, LastOwnerException, LineUnavailableException, MarshalException, MidiUnavailableException, MimeTypeParseException, MimeTypeParseException, NamingException, NoninvertibleTransformException, NotBoundException, NotOwnerException, ParseException, ParserConfigurationException, PrinterException, PrintException, PrivilegedActionException, PropertyVetoException, ReflectiveOperationException, RefreshFailedException, RemarshalException, RuntimeException, SAXException, ScriptException, ServerNotActiveException, SOAPException, SQLException, TimeoutException, TooManyListenersException, TransformerException, TransformException, UnmodifiableClassException, UnsupportedAudioFileException, UnsupportedCallbackException, UnsupportedFlavorException, UnsupportedLookAndFeelException, URIReferenceException, URISyntaxException, UserException, XAException, XMLParseException, XMLSignatureException, XMLStreamException, XPathException Exception의 subclass들

  • java8 기준으로 무수히 많은 subclass를 지니고 있음

  • 대표적으로 RuntimeException , IOException 이 있다.

AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DataBindingException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, FileSystemAlreadyExistsException, FileSystemNotFoundException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, IllformedLocaleException, ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException, LSException, MalformedParameterizedTypeException, MirroredTypesException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NoSuchMechanismException, NullPointerException, ProfileDataException, ProviderException, ProviderNotFoundException, RasterFormatException, RejectedExecutionException, SecurityException, SystemException, TypeConstraintException, TypeNotPresentException, UndeclaredThrowableException, UnknownEntityException, UnmodifiableSetException, UnsupportedOperationException, WebServiceException, WrongMethodTypeException RuntimeException 의 subclass들 ChangedCharSetException, CharacterCodingException, CharConversionException, ClosedChannelException, EOFException, FileLockInterruptionException, FileNotFoundException, FilerException, FileSystemException, HttpRetryException, IIOException, InterruptedByTimeoutException, InterruptedIOException, InvalidPropertiesFormatException, JMXProviderException, JMXServerErrorException, MalformedURLException, ObjectStreamException, ProtocolException, RemoteException, SaslException, SocketException, SSLException, SyncFailedException, UnknownHostException, UnknownServiceException, UnsupportedDataTypeException, UnsupportedEncodingException, UserPrincipalNotFoundException, UTFDataFormatException, ZipException IoException의 subclass들

Error와 Exception의 차이

  1. Exception은 Compile , Runetime 으로 구분지을수 있지만 Error는 Runtime 에만 나타난다.
  2. Error는 Control 할수 없지만 Exception은 Control할수 있다.

RuntimeException과 RuntimeException이 아닌것의 차이

  1. RuntimeException 실행중에 따로 명시적으로 예외처리를 강제 하지 않는다.
  2. RuntimeException이 아닌것은 명시적으로 예외처리를 강제로 해줘야한다.
  3. 이 예외처리는 컴파일시 체크한다.

같은 Exception인데 예외처리를 강제하지 않는 이유는 무엇일까 ?

  • 런타임 예외는 어느곳에서나 발생할수 있는 이슈이며 이것을 일일히 런타임 익셉션을 추가하거나 예외처리를 하는것은 프로그램의 명확성을 떨어뜨리기때문

커스텀한 예외 만드는 방법

  • 자신이 원하는 예외를 상속받아 구현한다

class CustomException extends RumtimeException { CustomException() { super();} CustomException(String message) { super(message); } }

출처

'백선생님 온라인스터디' 카테고리의 다른 글

10주차 멀티스레드 프로그래밍  (0) 2021.01.31
11주차 Enum  (0) 2021.01.30
8주차 - 인터페이스  (0) 2021.01.16
7주차 - 패키지  (0) 2021.01.12
6주차 상속  (0) 2021.01.10

목표

자바의 인터페이스에 대해 학습하세요.

학습할 것 (필수)

  • 인터페이스 정의하는 방법
  • 인터페이스 구현하는 방법
  • 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법
  • 인터페이스 상속
  • 인터페이스의 기본 메소드 (Default Method), 자바 8
  • 인터페이스의 static 메소드, 자바 8
  • 인터페이스의 private 메소드, 자바 9

인터페이스 정의하는 방법

public interface 인터페이스명 { }

인터페이스 구현하는 방법

public class 클래스명 implements 인터페이스명 { } interface는 extends 와 implements 갯수에 대한 제한이 없다.

인터페이스 레퍼런스를 통해 구현체를 사용하는 방법

인터페이스명 인스턴스명 = new 인터페이스명(); **또한 메소드가 한개일 경우 익명내부 클래스로도 구현할수 있다.** 인터페이스명 인스턴스명 = new 인스턴스명() { @Override 메소드관련정보 };

인터페이스의 상속

public interface 인터페이스명 extends 인터페이스명 { }

  • 상위 인터페이스를 상속받아 하위 인터페이스에서 사용할수 있다.
  • 상위 인터페이스의 구현을 extends로 하위인터페이스에서 default method로 할수 있다.

인터페이스의 기본 메소드 ( Default Method ) java 8

  • Java 8 부터 추가된 Default Method는

  • 메소드의 내부구현이 불가능했던 interface가 내부구현도 가능하도록 변경되었다.

  • 상속을 통한 인터페이스끼리의 구현도 가능해졌다.

  • 상위 인터페이스에서 작성한 메소드를 하위 인터페이스에서 상속받아 default method로 구현하는것이 그것이다.

  • 여러 인터페이스에서의 디폴트 메소드가 동일한 경우에는 구현클래스에서 디폴트 메소드를 오버라이딩 해줘야 한다.

  • 디폴트 메소드와 조상 클래스의 메소드간에 동일하는 경우에는 조상 클래스의 메소드가 상속되고 디폴트 메소드는 무시된다.

인터페이스의 스태틱 메소드 ( Static Method ) java 8

  • Java 8부터 추가된 static 메소드
  • static 메소드를 선언하여 메소드의 내부를 구현할수 있게 되었다.
  • 기존클래스처럼 class이름 메소드로 호출하는것이 아닌 인터페이스.이름으로 호출
  • 재정의는 불가능하다.
  • 하위 인터페이스가 상위의 스태틱 메소드를 상속하지 않는다.

참고

https://atoz-develop.tistory.com/entry/JAVA-8-interface-default-키워드와-static-메소드

https://dahyeee.tistory.com/entry/JAVA-interface-default-static메소드

https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.1

자바의정석

'백선생님 온라인스터디' 카테고리의 다른 글

11주차 Enum  (0) 2021.01.30
9주차 - 예외 처리  (0) 2021.01.19
7주차 - 패키지  (0) 2021.01.12
6주차 상속  (0) 2021.01.10
4주차 - 제어문  (0) 2021.01.09

목표

자바의 패키지에 대해 학습하세요.

학습할 것 (필수)

  • package 키워드
  • import 키워드
  • 클래스패스
  • CLASSPATH 환경변수
  • classpath 옵션
  • 접근지시자

package 키워드

  • 클래스들의 묶음.
  • 클래스가 물리적으로 하나의 .class 파일이라면 패키지는 하나의 디렉토리.

package 패키지명;

  • 선언 방법

    • 클래스 최상위에 패키지명을 적어준다.
  • 하나의 클래스 한번만 선언 할 수 있다.

  • 자바에서 기본적으로 unnamed package를 제공한다.

    • package를 선언하지않으면 자동으로 unnamed package가 된다.
    • 이렇게 생성된 클래스는 다른 package에 있는 자바 파일에서 import 할수 없다.
    • 같은 unnamed package에 있으면 import 가능.
  • 클래스 파일을 컴파일시 컴파일된 .class의 경로는 기본으로 지정한 경로에 컴파일러가 패키지의 계층구조에 맞게 디렉토리가 없으면 디렉토리를 생성하고 .class파일을 패키지 설정된 경로에 생성한다.

import 키워드

  • 다른 패키지의 클래스를 사용하려면 패키지명이 포함된 클래스 이름을 사용해야 한다.
  • 하지만 매번 패키지명을 적어서 쓰기엔 귀찮다.
  • 그래서 import 키워드를 사용하여 패키지명을 생략 시킬수 있다.

package 패키지명; import 패키지명.클래스명; 또는 import 패키지명.*; import 패키지명.클래스명 은 직접 그 클래스를 지정하는것이고 import 패키지명.*; 은 그 패키지의 모든 클래스를 포함하는것이다.

static import

  • import 키워드를 사용해 클래스의 패키지명을 생략 하듯이
  • static import 키워드를 사용해 static 멤버를 호출할때 클래스 이름을 생략할수 있다.

import static org.junit.Assert.assertThat; import static org.junit.Assert.*; assertThat(); assertEquals();

  • assertThat()은 import static으로 직접 선언했고
  • assertEquals는 import static으로 Assert 패키지 내의 모든 클래스를 선언했으므로 생략하고 사용할수 있다.

클래스패스

  • classpath 는 jdk tools 가 클래스를 찾을수 있게 기준이 되는 방법중 하나.

기본 방법 java -cp 경로 그외에 다른 방법들 windows 환경에서 사용방법 echo %CLASSPATH% linux 환경 echo $CLASSPATH

  • 이렇게 classpath를 등록 시켜놓으면 classpath에 설정된 경로를 생략할수 있다.

java -jar a.jar

  • classpath로 설정된 디렉토리 안에 a.jar파일이 있는 경우 classpath로 등록하면
  • 이런식으로 생략할수 있다.

CLASSPATH 환경변수

  • window 환경 , linux 환경 환경변수 설정은 클래스패스 항목에서 언급함

CLASSPATH 옵션

  • -cp 옵션은 클래스패스 항목에서 언급함.

추가로 -classpath 옵션도 -cp 옵션과 동일하게 작동한다.

접근지시자

  • 외부에서 멤버 또는 클래스에 접근할수 있는 권한을 정해주는것

  • private

    • 접근 불가
    • 같은 클래스에서만 접근할수 있음.
  • default

    • 같은 패키지내에서만 접근가능하다.
    • default 키워드는 생략 가능하다.
  • protected

    • 같은 패키지 내에서만 접근가능하다
    • 추가로 다른 패키지의 서브클래스에서 접근가능하다.
  • public

    • 어느곳에서나 접근가능하다.
  • private → default → protected → public

  • 우로 갈수록 접근범위가 넓어진다.

  • 생성자에도 접근지시자로 권한을 줘서 인스턴스 생성을 못하게 막을 수도 있다.

참고

https://docs.oracle.com/javase/specs/jls/se7/html/jls-7.html#jls-7.5

https://docs.oracle.com/javase/tutorial/essential/environment/paths.html

자바의정석

'백선생님 온라인스터디' 카테고리의 다른 글

9주차 - 예외 처리  (0) 2021.01.19
8주차 - 인터페이스  (0) 2021.01.16
6주차 상속  (0) 2021.01.10
4주차 - 제어문  (0) 2021.01.09
3주차 연산자  (0) 2021.01.07

+ Recent posts