개발 공부/Java

자바 기초 여러가지 정리

gmelon 2022. 3. 27. 17:26

개인적으로 맨날 쓰는데 맨날 헷갈리는 자바 기초 문법이나 특징 등등을 정리해봤습니다.

이 글은 제가 또 새롭게 헷갈리는 게 나오는 대로(?) 계속해서 업데이트할 예정입니다..😂

기본 자료형 vs 참조 자료형

  • 기본 변수는 메모리에 값 자체를 저장하지만 참조 변수는 참조하는 객체의 주소를 메모리(변수)에 저장한다.

JAVA에서 char 크기

  • c와 다르게 java에서는 char이 2byte로 저장된다.

서식 문자

  • %d - 10진수
    → %Xd - 오른쪽 정렬 + 최소 X칸 만큼 공백 유지
  • %o - 8진수
  • %x - 16진수
  • %f - 실수
    → %.Xf - 소수점 아래 X자리까지 출력
  • %c, %s - 문자, 문자열

조건문 (삼항 연산자) 축약 표현

  • 조건문 : true ? false

JAVA 배열의 특징

  • 자바에서 배열[] 은 최초 선언 이후 크기 변경이 불가능
  • 배열 변수 ex) arr_name은 데이터 자체가 아닌 데이터의 시작 주소를 저장. 데이터는 메모리의 별도 공간에 저장.
    • 따라서 deep copy를 위해서는 Arrays.copyOf(원본배열, 배열길이)를 사용
  • 배열의 출력을 위해서는 Arrays.toString(배열이름) 사용
    • 단순히 배열을 출력하려고 하면 배열 변수의 레퍼런스(주소 값)을 출력
/* 
 * 배열 선언 및 초기화 방법
 * 자료형[] 변수이름 = new 자료형[크기]
 * 형태로 사용
 */

SIZE = 10;

// 선언 및 초기화
int[] arr_name = new int[SIZE];
int[] arr_name = {10, 20, 30, 40, ...} // 선언하면서 값 대입도 가능 (대괄호 사용)

//선언 후 초기화
int[] arr_name;
arr_name = new int[SIZE];

JAVA Switch문

  • 각 case block에 break가 없으면 아래의 case block까지 이어서 실행함에 주의
switch (변수) {
    case 조건1:
        break;
    case 조건2:
        break;

    ...

    default:
        break;
}

오버로딩 vs 오버라이딩

  • 오버로딩 : 같은 함수 이름을 갖지만 매개변수, 리턴타입 등의 특징은 다른 여러 개의 함수
  • 오버라이딩 : 자신의 부모 클래스들 중 하나에 의해 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 재정의하는 것

Default Constructor (기본 생성자) ↔ 사용자 정의 생성자

  • 디폴트 생성자는 파라미터 없이 객체 생성 시(가장 먼저 호출되는)에 호출되는 생성자를 말함
    • 디폴트 생성자는 직접 정의하지 않으면 컴파일 시점에 컴파일러가 자동으로 생성
  • 사용자 정의 생성자는 여러 파라미터를 사용해서 정의할 수 있다.

JAVA 소멸자와 GC 작동 시점

  • System.gc(); 를 사용하면 GC가 최대한 빨리 작동하도록 명령할 수 있으나 바로 작동하는 것은 아니다.
    시스템이 알아서 시기를 판단하여 작동함
  • 객체가 소멸될 때는 객체의 finalize() 함수가 호출됨
    → 일반적인 경우, 직접 명시할 필요는 없음
  • "종료자는 사용하면 안 된다. 예측이 불가능하고 대체로 위험하고 일반적으로 필요하지 않다."

클래스 멤버 ↔ 인스턴스 멤버

  • 클래스에 static 키워드를 사용하여 클래스 멤버 (메서드, 변수)를 지정할 수 있다.
    • 클래스 멤버는 모든 인스턴스 간에 공유되며 컴파일 시에 메모리에 할당된다.
    • 따라서, 계좌의 총액 등 전체 객체 간에 공유되어야 하는 값이나 객체 없이도 클래스에 저장되어야 하는 상수 값등을 설정할 때 활용할 수 있다.
  • 클래스 멤버는 인스턴스에 의해 접근될 수 있지만 인스턴스 멤버는 클래스 멤버에 의해 접근될 수 없다.
    • 클래스 — 접근 O —> 인스턴스
    • 인스턴스 — 접근 X —> 클래스

getter, setter를 사용하는 이유

  • 함수를 통해 멤버 변수를 변경하게 함으로써 예외적인 상황이 발생하지 않도록 조건문 등의 안전장치를 걸 수 있다.

List vs ArrayList

  • List : 인터페이스
  • ArrayList : List를 implements한 클래스
  • ArrayList를 굳이 List<>로 선언하는 이유
    • Generic의 이점(구현체가 상황에 맞게 변경될 수 있음)을 취하기 위함

추상 클래스, 추상 메소드

  • 추상 메소드
    • 자식 클래스에서 반드시 오버라이딩해야만 사용할 수 있는 메소드
    • 상속 받은 클래스에서 재정의하지 않으면 compile error 발생
    • 아래와 같이 선언
    • abstract void doIt();
  • 추상 클래스
    • 추상 메소드를 하나 이상 가지고 있는 클래스
    • 추상 클래스는 객체 지향 프로그래밍에서 중요한 특징인 다형성을 가지는 메소드의 집합을 정의할 수 있도록 해준다.
    • 즉, 자식 클래스에서 반드시 사용 및 정의되어야 하는 메소드를 추상 클래스에 추상 메소드로 선언하고 모아놓는 것
    • 추상 클래스는 추상 메소드를 포함하므로 인스턴스의 생성이 불가능함
    • abstract class Foo { ... // 추상 메서드 abstract void doIt(); ... }