9 분 소요

이 포스트는 현재 작성중입니다.
미완성된 내용이나 코드가 존재하므로 유의하시기 바랍니다.

변수 (variable) : 하나의 값을 저장할 수 있는 메모리 번지에 붙어진 이름

  • 변수의 선언 : 어떤 차입의 데이터를 저장할지, 그리고 변수의 이름이 무엇인지 결정
  • 변수의 이름 : 첫번째 글자는 소문자로 시작하되, 캐멀 스타일 (Camel Style)로 작성하는 것이 관례
  • 값의 대입 (=) : 선언된 변수에 값을 저장 → 변수의 초기화

원시 자료형 (Primitive type) : 선언 시 메모리 주소 위치 (JVM stack)에 실제 값이 저장

논리 리터럴 (Boolean) : 참과 거짓을 의미

  • 논리 타입 (boolean) : true / false

정수 리터럴 (Integers) : 정수를

  • 문자 (char) : ''를 이용해 표시 (초기값 : '\0'=0)
  • 바이트 (byte) : 데이터를 나타내는 바이트 값 (초기값 : 0)
  • 정수 (short, int, long) : 2, 4, 8바이트 크기 내의 정수 (초기값 : 0)
  • 실수 (float, double) : 4, 8바이트 크기 내의 실수 (초기값 : 0.0)

참조 자료형 (Reference type) : 선언 시 메모리 주소 위치에 실제 값이 가리키는 다른 주소를 저장

  • 원시 자료형을 기초로 하여 만들어짐 → Non-Primitive type
  • 실제 값은 Heap에 저장

자바는 주소값의 추상화를 금지함, Call by value만 가능 (C/C++ : 주소값 저장 (*) 및 추출 (&) 가능)

var : 데이터 타입을 명시하지 않아도 지역 변수의 타입을 자동으로 추론하는 키워드

  • 지역 변수만 사용 가능 (static 적용 불가)
  • 선언과 함께 명시적인 초기화를 반드시 해야 함
  • NULL로 초기화할 수 없음
  • 람다 표현식과 같이 사용할 수 없음
var s = 'String';
var n = 100;

변수의 스코프 (Scope) : 변수가 유효한 범위

  • 접근 지정자 (access modifier) : 접근 가능한 수준 지정
    • public : 어느 클래스에서든 해당 클래스에 대해 접근 가능
    • protected : 해당 패키지와 같은 패키지 내에 있는 클래스와 상속받은 클래스가 해당 클래스에 접근 가능
    • default : 해당 클래스와 같은 패키지 내에 있는 클래스만이 해당 클래스에 대해 접근 가능
    • private : 해당 클래스 및 그 클래스를 포함한 클래스만이 해당 클래스에 대해 접근 가능

변수의 라이프타임 (LifeTime) : 변수가 메모리 영역에 저장되어 있는 시간

  • 인스턴스 변수 (static blockstatic method를 제외한 클래스 전체) : 객체가 생성되어 메모리에 존재하는 동안
  • 클래스 변수 (클래스 전체) : 클래스가 초기화되고 프로그램이 끝날 때까지
  • 로컬 변수 (변수가 선언된 블록의 내부) : 변수 선언 이후부터 블록을 벗어날 때까지

변수의 형변환 (Type Conversion) : 현재의 타입을 다른 타입올 바꾸는 것

boolean을 제외한 나머지 기본 자료형 간의 타입 변환이 가능

  • 타입 프로모션 (Type Promotion) : 범위가 작은 데이터 타입의 값을 더 큰 범위의 데이터 타입에 할당 (묵시적 형변환)
    • byte < short < int < long < float < double
int intN = 23;
long longN = intN;
  • 캐스팅 (Casting) : 범위가 큰 데이터 타입의 값을 더 작은 범위의 데이터 타입으로 할당 (명시적 형변환)
int n = 100;
c = (char) n;
  • 업캐스팅 (Up-Casting) : 부모-자식 관계의 객체에서 자식 객체를 부모 객체로 형변환 (묵시적 형변환)
  • 다운캐스팅 (Down-Casting) : 부모-자식 관계의 객체에서 부모 객체를 자식 객체로 형변환 (명시적 형변환)
class MyClass {
  String name;
  String ID;

  public MyClass(String name){
    this.name = name;
  }
}

class StudentClass extends MyClass {
  String grade;

  public StudentClass(String name){
    super(name);
  }
}

public class UpClass {
  public Static void main(String[] args){
    MyClass P;
    StudentClass S = new StudentClass("I");
    
    P = S; // 업캐스팅 발생

    System.out.println(P.name); // 컴파일 오류 없음

    S = (StudentClass) P;   // 다운캐스팅 발생

    System.out.println(S.name); // 컴파일 오류 없음
  }
}

배열 (Array) : 인덱스 (Index)와 그 인덱스에 대응하는 데이터들로 이루어진 선형 자료구조

  • 배열의 생성 : 배열 공간을 할당받는 과정 (배열에 대한 래퍼런스 변수 선언 + 배열 생성)
    • 래퍼런스 변수 : 메모리 상에 생성된 인스턴스를 가리키는 데에 사용되는 변수 (배열의 주소 값을 가짐)
    • new : 클래스의 새로운 객체를 생성할 때, 객체를 저장할 메모리를 할당하고 생성자를 호출해 객체를 초기화
    • = : 스택의 래퍼런스 변수가 힙의 배열 데이터를 가리킴
int[] intArray;
intArray = new int [10];
int[] intArray = new int [10];
int[] intArray = {1,2,3,4,5,6,7,8,9};
int[][] intArray2;
int intArray2 = new int[2][3];
int intArray2 = { {1, 2, 3}, {4, 5, 6} };
  • .length 필드 : 배열이 가진 길이 (원소의 개수)를 반환
len = intArray.length
len1 = intArray2.length     // 2차원 배열이 가진 행의 개수
len2 = intArray2[n].length  // 2차원 배열 중 n번째 행이 가진 열의 개수
  • 비정방형 배열 : 행마다 열의 개수가 서로 다른 배열
int[][] intArray3 = new int[3][];
intArray3[0] = new int[1];
intArray3[1] = new int[2];
intArray3[2] = new int[3];
int intArray3 = { {0}, {1,2}, {3,4,5} };
int intArray3[][] = { {0}, {1,2}, {3,4,5} };
  • 메소드의 배열 반환 : 실제 배열에 대한 래퍼런스가 반환
int makeArray() {
    int t = new int[4];
    return t;
}

int[] intArr = makeArray();
  • 객체 배열 : 객체에 대한 래퍼런스를 원소로 갖는 배열
Person[] people = new Person[20];

for(int i = 0; i < people.length; i++){
    people[i] = new Person();
    people[i].age = 20 + i;
}

객체 (Object) : 프로그램에서 사용되는 데이터 혹은 식별자에 의해 참조되는 공간

  • new : 객체를 생성하는 연산자
P = new Person("A");
P.age = 30;
  • 생성자 : 객체가 생성될 때 자동으로 호출되는 메소드 (객체에 필요한 초기화 수행)
    • this : 객체 자신을 참조
class MyClass {
    int id;

    public MyClass (int x) { // 생성자는 클래스 이름과 동일한 이름을 가짐
        this.id = x;
    }

    public void MyFunc (int id) {
        this.id = id;
    } 
}
  • this() : 동일한 클래스 내의 다른 생성자를 호출할 때 사용 (반드시 생성자의 첫 문장에서 사용되어야 함)
public MyClass {
    String title;
    int price;
    int id = 0;

    public MyClass(String title, int price, int id) {
        this.title = title;
        this.price = price;
        this.id = id;
        id += 1;
    }

    public MyClass(String title, int price, int id) {
        this.title = title;
        this.price = price;
        this.id = id;
        id += 1;
    }

    public MyClass(String title, int price) {
        this(title, price, id);
        id += 1;
    }

    public static void main(String[] args) {
        MyClass mart1 = new MyClass("apple", 100, 1);
        MyClass mart2 = new MyClass("banana", 200);
    }
}
  • 가비지 컬렉션 (garbage Collection) : new로 할당받고 사용하지 않는 객체의 메모리 공간을 자동으로 JVM에 반환
    • 소멸자 (delete)로 객체의 소멸을 명시해야 하는 C++과 달리, 자바는 소멸자가 필요 없음

클래스 (Class) : 객체를 생성하기 위해 변수와 메소드를 정의하는 틀

  • 필드 (Field) : 객체의 상태 혹은 속성 (인스턴스 변수, static 변수)
public class MyClass {
    String name;
    static long id;
}
  • 메소드 (method) : 객체의 행동 (인스턴스 메소드, static 메소드)
public class MyClass {
    string name;
    long id;

    string getName() {
        return name;
    }
    
    long getID() {
        return id;
    }

    void setName(String name) {
        this.name = name;
    }

    void setID(long id) {
        this.id = id;
    }
}
  • 생성자 (Constructor) : 객체를 생성한 후에 필요한 초기화 작업을 수행하는 메소드
public class MyClass {
    string name;
    long id;

    MyClass(String name, long id) {
        this.name = name;
        this.id = id;
    }
}
  • 초기화 블럭 (Initializer) : 객체를 생성한 후에 필요한 초기화 작업을 세분화
    • 클래스 초기화 블럭 : 클래스가 최초로 로딩될 때
    • 인스턴스 초기화 블럭 : 인스턴스가 생성되었을 때
public class MyClass {
    string name;
    static long id;
        // 클래스 초기화 블럭
    static {
        id = 1;
    }
        // 인스턴스 초기화 블럭
    {
        name = "이름";
        id += 1;
    }
}

캡슐화 (Encapsulation) : 변수나 메소드는 반드시 클래스 내에서만 구현 가능 / 클래스 안의 내부 클래스 구현 가능

public class (클래스 이름) {
    public static void main(String[] args {
        ...
    }

    class (내부 클래스 1 이름) {
        ...
    }

    static class (내부 클래스 2 이름) {
        ...
    }

    void (내부 함수 이름)() {
        ...
    }

   ...
}

상속 (Inheritance) : 부모 클래스에 정의된 필드와 메소드를 자식 클래스가 물려받는 것

public class Person {
   Person() { ... }
...
}
public class Student extends Person {
  super(); // 부모 클래스의 생성자를 호출
  ...
}

instanceof : 객체의 타입을 검사하는 연산자 (상속 관계 & 구현 관계 모두 포함)

``` class Lee extends Student implements Person { … }

Lee lee = new Lee(); assertThat(lee instanceof Lee).isTrue(); assertThat(lee instanceof Student).isTrue(); assertThat(lee instanceof Animal).isTrue(); assertThat(lee instanceof Person).isTrue();

```

main() : 해당 클래스를 자바 어플리케이션에서 실행하는 메소드

  • 접근 제어자 public : 다른 모든 클래스에서 호출 가능 (클래스 외부의 JVM에 의해 호출되어야 하므로)
  • static : 프로그램 시작부터 메모리에 저장됨 (프로그램이 시작할 때부터 JVM에 의해 호출되어야 하므로)
  • void : 종료 코드를 등록하기 위해 int를 반환해야 하는 ```C``와 달리, 종료 코드를 등록할 필요 없음
  • String[] args : 명령줄에 주어진 모든 인자를 문자열로 처리해 main()에 전달
public class (클래스 이름) {
    public static void main(String[] args {
        ...
    }
}

static : 모든 객체에 공통으로 사용하기 위해 정적으로 선언 (프로그램 시작부터 메모리에 저장)

  • static 메소드는 static 멤버만 사용할 수 있고, this 키워드를 사용할 수 없음

final : 오직 한 번만 할당할 수 있어 항상 같은 값을 가지는 entity를 정의할 때 사용하는 키워드

  • final 클래스 : 클래스가 상속받을 수 없음
public final class MyClass { ... }
  • final 메소드 : 오버라이딩으로 수정할 수 없음
public final class MySuperClass { 
    protected final void MyFunc() { ... }
}
public final class MyClass extends MySuperClass { 
    protected final void MyFunc() { ... } // 컴파일 오류
}
  • final 변수 : 한번 값을 할당하면 수정할 수 없는 상수 정의
static float Pl = 3.141592;

어노테이션 (Annotation) : 컴파일 & 실행 과정에서 코드를 어떻게 처리할지 알리는 메타데이터

  • 클래스나 메소드 위에 붙으며, @로 시작 : 어노테이션의 유무나 어노테이션에 설정한 값을 통해 클래스를 다르게 실행
@Override // 메소드를 오버라이딩 (상속받은 부모 클래스나 인터페이스에서 해당 메소드가 없으면 컴파일 오류)

자바 모듈 (Java Module) : 클래스, JAR, 패키지 수준의 코드 그룹화 제공

  • 하나의 자바 어플리케이션은 하나 이상의 .class 파일로 구성
  • 다수의 클래스 파일을 .jar 파일로 압축해 배포 및 실행 가능
  • 서로 관련 있는 클래스들은 하나의 패키지로 묶어서 관리

JDKScanner 클래스 : 자바의 키 입력 (Key input)

  • String next() : 문자열 타입으로 반환
  • Byte nextByte() : 바이트 타입으로 반환
  • short nextShort(), int nextInt(), long nextLong() : 정수 타입 (short, int, long)으로 반환
  • float nextFloat(), double nextDouble() : 실수 타입 (float, double)으로 반환
  • String nextLine() : 한 줄 전체 (\n)를 일고 문자열 타입으로 반환
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
String name = scan.nextLine();

자바 표준 입력 스트림 system.in : 입력되는 키 값을 바이트 정보로 반환 (문자 정보로 변환)

InputSteamReader rd = new InputSteamReader(System.in); // 키보드 입력 스트림 생성
int s = rd.read(); // 키보드로부터 문자 하나를 읽고 이를 s에 저장

예외 처리 (Exception handling) : 발생한 예외에 대해 작성한 프로그램 내에서 대응하는 것

  • 예외 (Exception) : 프로그램 실행 중에 발생하는 런타임 오류 (Runtime error)
    • Checked Exception : 컴파일러에 의해 예외 발생을 인지 (컴파일 오류)
    • Unchecked Exception : JVM에서 예외 발생을 인지 (예외 객체 생성 후 처리)

자바에서 자주 발생하는 예외

  • NullPointerException : Null 래퍼런스를 참조할 때 발생
  • ClassCastException : 변환할 수 없는 타입응로 객체를 변환할 때 발생
  • IOException : 입출력 동작 중에 인터럽트가 발생할 때 발생
  • NumberFormatException : 문자열이 나타내는 숫자와 일치하지 않는 타입의 숫자로 변환할 때 발생
  • IllegalArgumentException : 잘못된 인자를 전달할 때 발생
  • ArrayIndexOutOfBoundsException : 배열의 범위를 벗어나 접근할 때 발생
  • NoSuchMethodException : 런타임 시점에 존재하지 않는 메소드를 호출할 때 발생
  • try-catch-finally : 발생한 예외에 대한 예외처리를 하는 구문
    • try : 오류가 발생할 것으로 예상되는 부분
    • catch : 발생할 오류에 관련된 예외에 대해 대응할 부분
    • finally : 예외 발생 여부에 상관없이 반드시 실행되어야 하는 부분
    • throws: 예외 처리의 의무를 현재 예외가 발생한 메소드에서 그 메소드를 호출한 메소드로 전달
public void funcA() {
    try {
        ...
    } catch (Exception e) { // 예외가 발생할 때 생성된 예외 객체와 타입이 일치하면, 래퍼런스 변수가 생성된 예외 객체를 가리킴
        ...
    } finally {
        ...
    }
}

public void funcB() throws Exception { // throws로 예외 처리를 Exception로 전달
    ...
}

태그:

업데이트: