까먹는 개념 1 / Java

aljongjong·2022년 1월 25일
0

맨날까먹는거

목록 보기
10/13

public

  • 하나의 소스파일에는 public으로 선언된 클래스의 정의를 하나만 둘 수 있다. 소스파일의 이름은 public으로 선언된 클래스의 이름과 동일해야 한다.

정보은닉

  • 자바에서 말하는 ‘정보’는 클래스의 ‘인스턴스 변수’를 의미한다. 따라서 정보를 은닉한다는 것은 인스턴스 변수를 숨긴다는 뜻이다.

static

  • static 선언을 붙이면 이는 인스턴스 변수가 아닌 ‘클래스 변수’, static으로 선언된 변수는 변수가 선언된 클래스의 모든 인스턴스가 공유하는 변수이다, 클래스 변수는 인스턴스 내에 존재하는 변수가 아니라 ‘어떠한 인스턴스에도 속하지 않는 상태로 메모리 공간에 딱 하나만 존재하는 변수’이다. 다만 이 변수가 선언된 클래스의 인스턴스들은 이 변수에 바로 접근할 수 있는 권한이 있을 뿐이다.

  • 인스턴스 간에 데이터 공유가 필요한 상황에서 클래스 변수를 선언한다.

  • 참조를 목적으로만 존재하는 값은 final 선언이 된 클래스 변수에 담는다.

  • 클래스 메소드는 인스턴스에 속하지 않으므로 인스턴스 변수에 접근이 불가능하다.
    같은 이유로 클래스 메소드는 인스턴스 메소드의 호출도 불가능하다.

System.out.printX

  • System.out.println은 참조 값이 전달되면, 이 값의 인스턴스를 대상으로 toString 메소드를 호출한다. 그리고 이때 반환되는 문자열을 출력한다.

  • System.out.printf(“정수는 %d, 실수는 %f, 문자는 %c, 12, 24.5, ‘A’);
    “정수는 12, 실수는 24.5, 문자는 A”

배열

  • 인스턴스 변수에 접근이 가능하다는 것은 배열이 인스터스임을 보이는 결과이다. ex) int[] arr = new int[5]; -> arr.length;

  • 배열도 인스턴스이다. 따라서 인스턴스의 참조 값을 전달 및 반환하듯이 배열의 참조 값도 전달 및 반환할 수 있으며 그 방법에서도 차이가 없다.

  • Box[] arr = new Box[5]; -> 이는 Box 인스턴스 5개를 저장할 수 있는 참조변수의 배열이다. 즉, Box 인스턴스의 생성과는 관계가 없다. 위의 문장을 통해 5개의 Box 인스턴스를 저장할 수 있는 배열이 생성될 뿐이다.

  • 배열이 생성되면 모든 요소는 0 또는 null로 초기화된다.

생성자

  • 하위 클래스의 인스턴스 생성 시 상위 클래스, 하위 클래스의 생성자 모두 호출된다. 하위 클래스의
    인스턴스 생성 시 상위 클래스의 생성자가 먼저 호출된다.

  • 하위 클래스의 생성자에서 상위 클래스의 생성자 호출을 생략하면, 인자를 받지 않는 상위 클래스의 생성자 호출문이 자동으로 삽입된다.

  • 자바는 상속 관계에 있을지라도, 상위 클래스의 멤버는 상위 클래스의 생성자를 통해서 초기화하도록 유도하고 있다.(하위 클래스의 인스턴스 생성 과정에서 상위 클래스의 생성자가 호출되는 이유가 여기에 있다.)

  • 상속 관계에 있을지라도 인스턴스 변수는 각 클래스의 생성자를 통해서 초기화해야 한다

  • 상위 클래스와 마찬가지로 이를 상속하는 하위 클래스에서도 이름만으로 클래스 변수와 클래스 메소드에 접근이 가능하다.(static) 단 선언된 접근 수준 지시자가 접근을 허용해야 접근이 가능하다. 즉, private으로 선언이 되면 접근 불가이다.

상속 - 연관된 일련의 클래스에 대해 공통적인 규약을 정의할 수 있다

  • 상속의 기본 조건인 ‘IS-A 관계’ , 하위 클래스는 상위 클래스의 모든 특성을 지닌다, 거기에 더하여 하위 클래스는 자신만의 추가적인 특성을 더하게 된다.
    ex) 모바일폰/스마트폰 -> 스마트폰도 모바일폰이다. 스마트폰은 일종의 모바일폰이다. 컴퓨터/노트북 -> 노트북은 컴퓨터이다. 자동차/전기자동차 -> 전기자동차는 자동차이다

  • 상위 클래스의 참조변수는 하위 클래스의 인스턴스를 참조할 수 있다. MoBilePhone phone = new SmartPhone(“010-1111-2222”, “XXX”);
    모바일폰을 상속하는 스마트폰도 일종의 모바일폰이다. -> MobilePhone을 상속하는 SmartPhone 인스턴스는 MobilePhone 인스턴스이기도 하다. 따라서 MobilePhone형 참조변수는 SmartPhone 인스턴스를 참조할 수 있다.

  • MobilePhone형 참조변수가 SmartPhone 인스턴스를 참조하고 있어도 접근이 가능한 멤버는 MobilePhone 클래스에 정의되었거나 이 클래스가 상속하는 클래스의 멤버로 제한된다.

  • 참조변수가 참조하는 인스턴스의 종류에 상관없이, 참조변수의 형에 해당하는 클래스와 그 클래스가 상속하는 상위 클래스에 정의된 메소드들만 호출이 가능하다.

  • 자바는 ‘참조변수의 형’만을 가지고 대입의 가능성을 판단한다.CheeseCake extends Cake
    Cake ca1 = new CheeseCake(); -> CheeseCake ca2 = ca1;(X)

오버라이딩

  • 메소드의 이름, 메소드의 반환형, 메소드의 매개변수 선언 -> 이 세가지가 같아야 ‘메소드 오버라이딩’이 성립한다.

  • 변수는 오버라이딩 되지 않는다. 따라서 ‘참조변수의 형’에 따라서 접근하는 변수가 결정된다. 이러한 특성은 클래스 변수와 클래스 메소드의 경우에도 마찬가지이다. 클래스 변수와 클래스 메소드도 오버라이딩 대상이 아니다.
    CheeseCake c1 = new CheeseCake(); c1.size => CheeseCake의 size에 접근
    Cake c2 = new CheeseCake(); c2.size => Cake의 size에 접근

상속2

  • 모든 인스턴스는 System.out.println의 인자로 전달될 수 있음, 인스턴스가 인자로 전달되면, toString 메소드가 호출되면서 이때 반환되는 문자열이 출력

  • 자바의 모든 클래스는 Object 클래스를 직접 혹은 간접적으로 상속하게 되어있다. -> 자바의 모든 인스턴스에 공통된 기준 및 규약을 적용하기 위함.

  • final 선언으로 해당 클래스를 다른 클래스가 상속하지 못하게 할 수 있다. 메소드도 final 선언을 하면 오버라이딩 불가하게 할 수 있다.

인터페이스

  • 메소드의 몸체가 비어 있는 메소드를 가리켜 ‘추상 메소드(Abstract Methods)’라 한다. 인터페이스를 대상으로는 인스턴스 생성이 불가능하다.

  • 인터페이스의 형을 대상으로 참조변수의 선언이 가능하다. 인터페이스의 추상 메소드와 이를 구현하는 메소드 사이에 오버라이딩 관계가 성립한다. -> 따라서 어노테이션 @Override의 선언이 가능하다.

  • 인터페이스 사이에도 상속이 가능하고, 이를 명시할 때 extends를 사용한다.

  • 인터페이스의 디폴트 메소드는 자체로 완전한 메소드이다.(완전한 메소드라는게 추상 메소드처럼 이름, 매개변수;로 끝나는게 아니라 괄호까지 있어서 그런듯?) 따라서 이를 구현하는 클래스가 오버라이딩 하지 않아도 된다.

예외

  • 예외 발생시 해당 예외 클래스의 인스턴스를 가상머신이 생성한다. 그리고 이 인스턴스를 프로그래머가 처리하면 예외는 처리된 것으로 간주하여 프로그램을 종료하지 않는다. 그러나 이 인스턴스를 처리하지 않으면 프로그램은 그냥 종료된다.

  • try 영역에서 발생한 예외 상황을 catch 영역에서 처리한다. try 영역의 실행 중간에 예외 상황이 만들어지고 이로 인해 가상머신이 예외 클래스 인스턴스를 생성하면, 이 인스턴스는 메소드를 호출하듯이 catch 구문의 매개변수 e에 전달이 된다. 그러면 가상머신은 catch 구문 안에서 무엇을 하든 상관없이 예외가 처리된 것으로 간주하고 실행을 이어나간다.

  • Error 클래스를 상속하는 예외나 RuntimeException 클래스를 상속하는 예외의 경우 예외의 처리는 선택이다. 그러나 Exception 클래스를 상속하는(그러나 RuntimeException을 상속하지 않는) 예외는 try ~ catch문으로 처리하거나 다른 영역으로 넘긴다고 반드시 명시해야 한다.

  • Error를 상속하거나 RuntimeException을 상속하는 예외의 발생은 코드 작성 과정에서 특별히 무언가를 하지 않아도 된다. 그러나 Exception을 상속하는 예외의 발생에 대해서는 try ~ catch문을 통해서 예외를 처리하거나 throws 선언을 통해서 예외의 처리를 넘긴다는 표시를 꼭 해야한다.

메모리 영역

  • 메소드 영역 (Method Area) - 메소드의 바이트코드, static 변수
    스택 영역 (Stack Area) - 지역변수, 매개변수
    힙 영역 (Heap Area) - 인스턴스

  • 메소드 영역 - 소스 파일을 컴파일할 때 생성되는, 자바 가상머신에 의해 실행이 가능한 코드를 가리켜 ‘바이트코드(Bytecode)’라 한다. 바이트코드가 메모리 공간에 존재해야 실행이 가능하다. 인스턴스의 생성 및 클래스 변수의 접근을 위해서는 먼저 해당 클래스의 바이트코드가 메모리 공간에 로딩되어야 하는데(메모리 공간에 올려져야 하는데), 이때 로딩되는 메모리 공간이 ‘메소드 영역’이다. 즉, 메소드 영역은 특정 클래스의 정보가 메모리 공간에 올려질 때 채워지는 영역이다.

  • 스택 영역 - 스택은 지역변수와 매개변수가 저장되는 공간이다. 이 둘의 공통점은 중괄호로 구분되는 지역 내에서만 유효한 변수들이다. 즉, 중괄호 내에 할당된 이후에 해당 중괄호를 벗어나면 바로 소멸되는 특성의 데이터 저장을 위한 영역이다. 지역변수와 매개변수는 선언되는 순간에 스택에 할당되었다가 자신이 할당된 영역을 벗어나면 소멸이 된다.

  • 힙 영역 - 인스턴스를 스택이 아닌 힙이라는 별도의 영역에 할당하는 이유는 인스턴스의 소멸 시점과 소멸 방법이 지역변수와 다르기 때문이다. 인스턴스를 참조하는 참조변수는 지역변수이다. 참조변수는 스택에 할당되고 인스턴스는 힙에 할당되어 스택의 참조변수가 힙의 인스턴스를 참조하는 형태이다. 아무런 참조변수도 참조하지 않는 상태의 인스턴스는 ‘소멸의 대상’이 되어 가상머신에 의해 소멸이 이뤄진다.(가비지 컬렉션(Garbage Collection))

  • 두 ‘인스턴스’의 내용 비교를 원한다면 Object 클래스의 equals 메소드를 오버라이딩, 단순히 참조변수의 참조 값을 비교하려면 == 연산.

  • 접근 범위를 제한하는 형태의 오버라이딩은 불가능하다. public으로 선언된 메소드를 protected로 바꿀 수는 없다. protected -> public 가능

래퍼 클래스

  • public static void showData(Object obj) { System.out.println(obj); } -> 이 메소드는 인스턴스를 인자로 요구한다. 인스턴스의 참조 값을 요구하는 자리에 기본 자료형의 값을 놓아야 할 경우 필요한 것이 ‘래퍼 클래스’이다. 래퍼 클래스는 기본 자료형의 값을 감싸는 클래스이다.(오토 박싱, 언박싱이 있다~)

  • 실수를 ‘문자열’로 전달하여 BigDecimal 인스턴스 생성, BigDecimal d1 = new BigDecimal(“1.5”);
    BigDecimal d1 = new BigDecimal(1.5), 실수를 그대로 인자로 전달할 수 있지만 인스턴스에 저장된 값은 더이상 1.5가 아니다. 실수는 표현되는 순간부터 오차를 지니기 때문이다.

0개의 댓글

관련 채용 정보