Java 개념 정리1

고 연우·2022년 8월 26일
0

Java

목록 보기
1/6

Static

  • static으로 선언된 함수(메서드)나 변수는 자바 버추얼 머신에서 인스턴스 객체의 생성 없이 호출 할 수 있음
  • 즉, 객체 생성없이 해당 함수를 호출해서 사용 가능
  • 자바 프로그램 실행하면 static으로 지정된 메서드를 찾아서 먼저 메모리에 할당시킴
  • static으로 지정된 메서드가 여러개인 경우 객체를 생성하는 것과 상관없이 모두 메모리에 할당시킴
  • 그 후에, 'main' (main 은 다른 이름으로 지정할 수 없음)으로 이름이 만들어진 메서드가 있는지를 찾아서 그 메서드를 가장 먼저 시작점의 메서드로써 호출 함
  • 프로그램 시작 시 최초에 단 한번만 생성되고 초기화됨
  • 해당 클래스의 모든 인스턴스가 공유
  • 초기화 블록에도 사용 가능

final

  • 먼저 상수란, 변수와 마찬가지로 데이터를 저장할 수 있는 메모리 공간을 의미함
    • 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없음
    • 선언과 동시에 반드시 초기화해줘야 함
  • C++ 에서는 const 키워드, Java에서는 final 키워드 사용하여 상수 선언
    • Ex) final int A = 30;
  • 클래스에 사용 시, 다른 클래스가 상속받을 수 없음
  • 메소드에 사용 시, 해당 메소드는 오버라이딩을 통한 재정의 할 수 없음
    • 메소드 오버라이딩( method overrinding ) : 상속받은 부모 클래스의 메소드를 재정의하여 사용

배열

( C++과 조금 다른 점이 있어서 기록해둘 겸... )

  • 타입[] 배열이름;
  • 타입 배열이름[];
  • 배열이름 = new 타입[ 배열길이 ];
  • 타입[] 배열이름 = new 타입[ 배열길이 ];
    Ex)
int[] grade1 = new int[3];    //타입[] 배열이름 = new 타입[배열길이]
int[] grade3 = new int[]{1, 2, 3};    //타입[] 배열이름 = new 타입[]{}

객체 지향 프로그래밍

클래스( class ) : 객체를 정의하는 틀 또는 설계도

  • 자바에서는 클래스를 가지고 여러 객체를 생성하여 사용함
  • 객체( object ) : 데이터
  • 필드( field ) : 객체의 상태를 나타냄, 클래스에 포함된 변수(variable ) 의미
  • 메소드( method ) : 객체의 행동을 나타냄, 어떤 특정 작업을 수행하기 위한 명령문의 집합

인스턴스( instance ) : 클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스 화라고 함

  • 메모리에 할당된 객체 의미
  • 하나의 클래스로부터 여러 개의 인스턴스를 생성할 수 있음
  • 독립된 메모리 공간에 저장된 자신만의 필드 가질 수 있음
  • 해당 클래스의 모든 메소드는 해당 클래스에서 생성된 모든 인스턴스가 공유하게 됨
  • 클래스 변수와 인스턴스 변수는 별도로 초기화하지 않으면, 자동으로 초기화 시켜줌
  • 인스턴스 변수 중 private 변수가 있다면 public 메소드로 해당 변수 초기화...

메소드( method )

  • 접근 제어자 : 해당 메소드에 접근할 수 있는 범위 명시( private, public, protected 이런 것들? )
  • 반환 타입( return type )
  • 메소드 이름
  • 매개변수 목록( parameters )

Ex)

//class
//-차(Car) : 설계도

//filed
car.modleName = "람보르기니"
car.modelYear = 2016
car.color = "주황색"
car.maxSpeed = 350

//method
car.accelerate();
car.brake();

//instance
//myCar : 설계도에 의해 생성된 차량
//friendCar : 설계도에 의해 생상된 또 다른 차량

//자동차 인스턴스는 같은 필드와 메소드 갖게 됨
//각 인스턴스마다 가지고 있는 프로퍼티의 값은 전부 다름

생성자( constructor )

  • 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화 할 수 있는 생성자 메소드 제공
  • 반환값 없음, 초기화를 위한 인수 전달받을 수 있음, 하나의 클래스가 여러 개의 생성자 가질 수 있음..
  • 메소드 오버로딩 가능
  • 매개변수가 없는 기본 생성자 호출하지만 매개변수가 있는 생성자를 하나 이상 정의한 후 기본 생성자 호출 시 오류 발생

this, this()

  • this : 인스턴스가 자기 자신을 참조하는데 사용하는 변수
    • 인스턴스 메소드에서만 사용 가능
  • this() : 생성자 내부에서만 사용 가능, 같은 클래스의 다른 생성자 호출 시 사용

메소드 오버로딩( method overloading )

  • 같은 이름의 메소드를 중복하여 정의하는 것
  • 다형성을 구현하는 방법 중 하나

제어자 정리

패키지( package ) : 클래스와 인터페이스의 집합

  • 물리적으로 하나의 디렉터리 의미
  • package 패키지이름(패키지의 경로까지 포함한 풀 네임 명시)

import 문

  • 풀 네임 명시는 비효율적, 클래스의 패키지에 대한 정보를 미리 제공해줌
  • 다른 패키지에 속한 클래스를 패키지 이름을 제외한 클래스 이름만으로 사용할 수 있게 됨
import 패키지이름.클래스이름    //해당 패키지의 특정 클래스만을 사용
import 패키지이름.*;            //해당 패키지의 모든 클래스를 클래스 이름만으로 사용하고 싶을 때

접근 제어자( access modifier )

  • 정보 은닉을 위해 제공
  1. private : 해당 멤버를 선언한 클래스에서만 접근 가능
  2. public : 외부로 공개되며, 해당 객체를 사용하는 어느 프로그램 어디에서나 직접 접근 가능
  3. default : 접근 제어자 지정 없을 시 자동으로 세팅됨, 같은 클래스 또는 패키지에 속하는 멤버에서만 접근 가능
  4. protected : 부모 클래스에 대해서는 public멤버처럼 취급, 외부에서는 private 멤버처럼 취급
  • 같은 패키지에 속하는 클래스와 다른 패키지에 속하는 자식 클래스에서만 접근 가능
    **범위 : public > protected > default > private

abstract

  • 선언부만 있고 구현부가 없는 메소드를 추상 메소드라 부름, 반드시 abstract 제어자 붙여야함
  • 하나 이상의 추상 메소드를 포함하고 있는 추상 클래스도 반드시 abstract 제어자 붙여야함

field 좀 더 상세히!

  1. 클래스 변수( = 공유 변수 ) : 클래스 영역에 위치한 변수 중 static 키워드를 가지는 변수
  2. 인스턴스 변수 : 클래스 영역에 위치한 변수 중 static 키워드 가지지 않는 변수
  3. 지역 변수( local variable ) : 메소드, 생성자, 초기화 블록 내에 위치한 변수
    Ex)
class Field {
    static int classVar = 10; // 클래스 변수 선언
    int instanceVar = 20; // 인스턴스 변수 선언
}

public class Java100_variable_HelloJava {
    public static void main(String[] args) {
        int var = 30; // 지역 변수 선언
        System.out.println(var + "\n"); // 지역 변수 참조

        Field myField1 = new Field(); // 인스턴스 생성
        Field myField2 = new Field(); // 인스턴스 생성

        System.out.println(Field.classVar); // 클래스 변수 참조
        System.out.println(myField1.classVar);
        System.out.println(myField2.classVar + "\n");

        myField1.classVar = 100; // 클래스 변수 값 변경

        System.out.println(Field.classVar); // 클래스 변수 참조
        System.out.println(myField1.classVar);
        System.out.println(myField2.classVar + "\n");

        System.out.println(myField1.instanceVar); // 인스턴스 변수 참조
        System.out.println(myField2.instanceVar + "\n");

        myField1.instanceVar = 200;
        System.out.println(myField1.instanceVar); // 인스턴스 변수 참조
        System.out.println(myField2.instanceVar);
    }
}

//결과
30

10 
10 
10

100
100
100

20
20

200
20

//클래스 변수는 생성된 모든 인스턴스가 같은 값을 공유함
//인스턴스 변수는 각 인스턴스마다 고유한 값을 가짐

method 좀 더 상세히!

  1. 클래스 메소드( static method ) : static 키워드를 가지는 메소드
  2. 인스턴스 메소드( instance method ) : static 키워드 가지지 않는 메소드
    Ex)
class Method {
    int a = 10; // 인스턴스 변수
    int b = 20; // 인스턴스 변수

    int add() {
        return a + b;
    } // 인스턴스 메소드

    static int add(int x, int y) {
        return x + y;
    } // 클래스 메소드
}

public class Java100_variable_HelloJava {
    public static void main(String[] args) {
        System.out.println(Method.add(20, 30)); // 클래스 메소드 호출
        Method myMethod = new Method(); // 인스턴스 생성
        System.out.println(myMethod.add()); // 인스턴스 메소드 호출
    }
}

// 결과
50
30

초기화 블록

  • 자바에서 필드는 변수의 타입에 맞는 초깃값으로 자동으로 초기화해줌
  • 명시적 초기화, 생성자를 이용한 초기화, 초기화 블록을 이용한 초기화
  • 인스턴스 초기화 블록
    • 인스턴스가 생성될 때 마다 실행됨
    • 인스턴스 초기화 블록이 생성자보다 먼저 실행됨
    • 여러 개의 생성자가 있을 경우 공통으로 수행되는 코드를 초기화 블록에 포함하여 코드의 중복 막음
    • 기본값 -> 명시적 초기화 -> 인스턴스 초기화 블록 -> 생성자 순으로 초기화

Ex)

class Car {
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;

    {
        this.currentSpeed = 0; // 인스턴스 초기화 블록
    }

    Car() {
    }

    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
    }

    public int getSpeed() {
        return currentSpeed;
    }
}

public class Java100_variable_HelloJava {
    public static void main(String[] args) {
        Car myCar = new Car(); // 인스턴스 생성
        System.out.println(myCar.getSpeed()); // 인스턴스 메소드 호출
    }
}
  • 클래스 초기화 블록
    • 클래스가 처음으로 메모리에 로딩될 때 단 한 번만 실행됨
    • 기본값 -> 명시적 초기화 -> 클래스 초기화 블록 순으로 초기화

Ex)

class InitBlock {
    static int classVar;        // 클래스 변수
    int instanceVar;            // 인스턴스 변수

    static {                    // 클래스 초기화 블록을 이용한 초기화
        classVar = 10;
    }
}

public class Java100_variable_HelloJava {
    public static void main(String[] args) {
        System.out.println(InitBlock.classVar);     // 클래스 변수에 접근
    }
}

참고

인프런 - 예제로 공부하는 Java 100문제 풀이 Part.1 참고
TCP School - Java 강의 참고

0개의 댓글