자바의 신 1️⃣

minisoo·2023년 7월 12일
0

공부하면서 헷갈렸던 부분들 위주로 정리해봤다 🌝

1. 변수의 종류

  • 지역 변수 : 중괄호 내에서 선언된 변수로 지역 변수를 선언한 중괄호 내에서만 유효
  • 매개 변수 : 메소드에 넘겨주는 변수로 메소드가 호출될 때 생명이 시작되고, 메소드가 끝나면 소멸
  • 인스턴스 변수 : 메소드 밖에, 클래스 안에 선언된 변수, 앞에는 static이라는 예약어가 없어야 한다. 이 변수는 객체가 생성될 때 생명이 시작되고, 그 객체를 참조하고 있는 다른 객체가 없으면 소멸된다.
  • 클래스 변수 : 인스턴스 변수처럼 메소드 밖에, 클래스 안에 선언된 변수 중에서 타입 선언 앞에 static이라는 예약어가 있는 변수로 클래스가 처음 호출될 때 생명이 시작되고, 자바 프로그램이 끝날 때 소멸된다.
public class Test {
int 인스턴스_변수;
static int 클래스_변수;
public void method(int 매개_변수) {
	int 지역_변수;
	}
}

2. 자료형

  • new를 사용해서 초기화하는 것을 참조 자료형, 그렇지 않고 바로 초기화가 가능한 것을 기본 자료형이라고한다. 여기서 String은 참조 자료형이지만 new를 사용해서 객체를 생성하지 않아도 되는 유일한 타입이다.
  • 기본 자료형
    • 정수형 : byte, short, int, long, char
    • 소수형 : float, double
    • 기타 : boolean
  • 모든 참조 자료형은 초기화(new 예약어를 써서 생성자를 부르는작업)을 하지 않으면 null이다.
  • 자바의 생성자는 자바 클래스의 객체(또는 인스턴스)를 생성하기 위해서 존재한다.
  • 기본자료형은 pass by value, 참조자료형은 pass by reference

3. 메소드

  • 매개 변수 개수가 같아도 타입의 순서가 다르면 다른 메소드처럼 인식된다.
  • 중요한 것은 매개 변수 이름이 아니라 타입! 타입이 다르면 다른 메소드로 생각하지만, 타입이 같고 변수 이름이 같으면 같은 메소드로 인식
  • System.out.println()은 static 메소드이기 때문에 객체를 생성하지 않아도 메소드를 호출할 수 있다.
  • static 메소드는 클래스 변수만 사용할 수 있다.

4. 접근 제어자

  • public : 누구나 접근 가능
  • protected : 같은 패키지 내에 있거나 상속받은 경우에만 접근 가능
  • package-private : 아무런 접근 제어자를 적어주지 않을 때 해당, 같은 패키지 내에 있을 때만 접근 가능
  • private : 해당 클래스에서만 접근 가능

5. 상속

  • 부모 클래스에 정의한 생성자가 String을 매개 변수로 받는 생성자밖에 없는 경우 기본 생성자가 자동으로 만들어지지 않기 때문에 자식 클래스에서 부모 클래스를 상속받아 자식 클래스 생성자를 만들었을 경우 에러가 발생한다.
  • 이 경우 부모 클래스에 매개 변수가 없는 기본 생성자를 만들거나 자식 클래스에서 부모 클래스의 생성자를 명시적으로 지정하는 super()를 사용해서 해결할 수 있다.
  • Overriding된 메소드의 접근 제어자는 부모 클래스에 있는 메소드와 달라도 되지만, 접근 권한이 확장되는 경우에만 허용된다. 접근 권한이 축소될 경우 컴파일 에러가 발생
부모 클래스 obj = new 자식클래스(); => 가능
자식 클래스 obj2 = new 부모클래스(); => 불가능

6. enum

  • enum 클래스의 생성자는 아무것도 명시하지 않는 package-private, private 접근 제어자만 사용할 수 있다. public이나 protected를 생성자로 사용하면 안된다.

7. 예외

  • checked exception
  • error
  • runtime exception 혹은 unchecked exception
  • error는 프로세스에 영향을 주고, exception은 쓰레드에만 영향을 준다.
  • 메소드를 선언할 때 매개 변수 소괄호 뒤에 throws라는 예약어를 적어 준 뒤 예외를 선언하면, 해당 메소드에서 선언한 예외가 발생했을 때 호출한 메소드로 예외가 전달된다.
  • 만약 메소드에서 두 가지 이상의 예외를 던질 수 있다면, 콤마로 구분하여 예외 클래스 이름을 적어주면 된다.
  • try블록 내에서 예외를 발생시킬 경우에는 throw라는 예약어를 적어 준 뒤 예외 객체를 생성하거나, 생성되어있는 객체를 명시해준다.
  • throw한 예외 클래스가 catch 블록에 선언되어 있지 않거나, throws 선언에 포함되어있지 않으면 컴파일 에러가 발생한다.
public void throwsException(int number) throws Exception {
	if ~~ {
    	throw new Exception("error");
    }
}

public static void main(String args[]) {
	ThrowSample sample = new ThrowSample();
    try {
    	sample.throwsException(10);
    } catch(Exception e) {
    
    }
}

8. String

String text = "check value";
String text2 = "check value";

text == text2 //true
text.equals(text2) //true
  • 두 객체가 같다고 인식되는 이유는 자바에서는 객체들을 재사용하기 위해서 Constant Pool이라는 것이 만들어져 있고, String의 경우 동일한 값을 갖는 객체가 있으면, 이미 만든 객체를 재사용한다. 따라서 둘은 같은 객체이다.
  • == 은 기본 자료형에서만 사용할 수 있고, '주소값'을 비교한다.
  • equals() 메서드를 오버라이딩하지 않으면 hashCode값을 비교하기 때문에 객체 비교시 다르다는 결과가 나오게 된다.
  • 어떤 String 객체를 만들더라도, 그 객체는 내부에 char 배열을 포함한다.
  • String은 immutable한 객체로 한 번 만들어지면 그 값을 바꿀 수 없다. String 문자열을 더하면 새로운 String 객체가 생성되고, 기존 객체는 버려진다.
  • String 클래스의 단점을 보완하기 위해 나온 클래스 StringBuffer, StringBuilder는 문자열을 더하더라도 새로운 객체를 생성하지 않는다.
  • StringBuffer가 Thread safe하고, StringBuilder는 Thread safe하지 않다.

9. 클래스 안의 클래스

  • Nested class
    • Static nested class
    • inner(내부) class
      • Local inner class
        • Anonymous inner(내부 익명) class
  • 내부 클래스 사용이유
    • 한곳에서만 사용되는 클래스를 논리적으로 묶어서 처리할 필요가 있을 때
    • 캡슐화가 필요할 때, 내부 구현을 감추고 싶을 때
    • 소스의 가독성과 유지보수성을 높이고 싶을 때
  • 익명 클래스 사용이유
    - 클래스를 만들고, 그 클래스를 호출하면 그 정보는 메모리에 올라가게 된다. 클래스를 많이 만들수록 메모리는 많이 필요해지고, 애플리케이션을 시작할 때 더 많은 시간이 소요된다. 그래서 자바에서는 간단한 방법으로 객채를 생성하는 방법을 제공하는 것이다. 그렇다고 클래스 한 개 더 만든다고 해서 애플리케이션 시작 시간이 더 걸리는 것은 아니지만, 줄일 수 있으면 줄이는 것이 좋다.
  • static nested 클래스는 감싸고 있는 클래스의 static 변수만 참조할 수 있다. 내부 클래스와 익명 클래스는 감싸고 있는 클래스의 어떤 변수라도 참조할 수 있다.

10. 어노테이션

  • 어노테이션은 클래스나 메소드 등의 선언시에 @를 사용하는 것을 말한다.
  • 어노테이션은 컴파일러에게 정보를 알려주거나, 컴파일할 때와 설치시의 작업을 지정하거나, 실행할 때 별도의 처리가 필요할 때 사용한다.
  • 미리 정해져 있는 어노테이션
    • @Override
      • 해당 메소드가 부모 클래스에 있는 메소드를 Override 했다는 것을 명시적으로 선언
    • @Deprecated
      • 클래스나 메소드가 더 이상 사용되지 않는 경우를 명시
    • @SupressWarnings
      • 의도된 코딩으로 컴파일러 경고가 신경쓰일 때 사용
  • 어노테이션은 상속을 지원하지 않는다.
profile
코딩하는 돌멩이 👻

0개의 댓글