Java 기초 2

이수빈·2023년 7월 21일
0

JAVA

목록 보기
2/4

배열선언

int[] grade1 = new int[3]; // 1차원 배열
int[][] arr = new int[2][3];
  • 가변배열 생성가능 => 자바에서는 배열을 한번 생성하면 길이를 변경 할 수 없다.
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[4];
arr[2] = new int[1];

더 많은 데이터를 저장하기 위해서는 더 큰 배열을 만들고 이젠 배열의 데이터를 복사해야함

=>
1. System 클래스의 arraycopy() 메소드
2. Arrays 클래스의 copyOf() 메소드
3. Object 클래스의 clone() 메소드
4. for 문과 인덱스를 이용한 복사

Enhanced for Loop

for (타입 변수이름 : 배열이나컬렉션이름) {
배열의 길이만큼 반복적으로 실행하고자 하는 명령문;
}

int[] arr = new int[]{1, 2, 3, 4, 5};
 
for (int e : arr) {
    System.out.print(e + " ");
}

생성자 오버로딩

  • 객체의 인스턴스 변수를 값으로 초기화하는 기능 제공, 해당클래스의 이름과 같아야함.

  • 생성자 또한 오버로딩이 가능함, 생성자는 하나이상 정의되어야 하지만, 생성자가 없다면 기본생성자를 제공해줌.

class Car {
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;
 
    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    }
 
    public String getModel() {
        return this.modelYear + "년식 " + this.modelName + " " + this.color;
    }
}
 
public class Method02 {
    public static void main(String[] args) {
        Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출
        System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.
    }
}

This

  • 자기참조변수임 => 해당 인스턴스의 주소를 나타낸다.

  • 클래스메소드(static)에서는 this 참조변수를 사용할 수 없다.

  • This() 메소드 => 같은 클래스의 다른 생성자를 호출할 때 사용함.(메소드에 인수를 전달하면 일치하는 생성자 반환해줌)

class Car {
    private String modelName;
    private int modelYear;
    private String color;
    private int maxSpeed;
    private int currentSpeed;
 
    Car(String modelName, int modelYear, String color, int maxSpeed) {
        this.modelName = modelName;
        this.modelYear = modelYear;
        this.color = color;
        this.maxSpeed = maxSpeed;
        this.currentSpeed = 0;
    }
 
    Car() {
        this("소나타", 2012, "검정색", 160); // 다른 생성자를 호출함.
    } // 기본값 초기화할 때
 
    public String getModel() {
        return this.modelYear + "년식 " + this.modelName + " " + this.color;
    }
}
 
public class Method05 {
    public static void main(String[] args) {
        Car tcpCar = new Car(); System.out.println(tcpCar.getModel());
    }
}

접근제어자

  • 접근범위 : public > protected > default > private

Public 접근제어자

  • 외부에서 접근가능한 제어자

Private 접근제어자

  • 외부에 공개되지 않으며 외부에서 직접 접근 불가능, public 메소드를 통해서만 접근 가능함(해당 클래스에서만 접근 가능함)

Default 접근제어자

  • 기본값(같은 클래스 멤버, 패키지에 속하는 멤버에서 접근가능)
package test;
 
public class SameClass {
    String var = "다른 패키지는 접근 불가"; // default 필드
    public static void main(String[] args) {
        SamePackage sp = new SamePackage();
        System.out.println(sp.sameVar);     // 같은 패키지는 허용
    }
}

Protected 접근제어자

  • protected 멤버는 부모 클래스에 대해서는 public 멤버처럼 취급되며, 외부에서는 private 멤버처럼 취급됩니다.
  • 클래스의 protected 멤버에 접근할 수 있는 영역은 다음과 같습니다.
  1. 이 멤버를 선언한 클래스의 멤버
  2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버
  3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버

Final 제어자

  • 상수취급함, 클래스, 메소드에도 사용가능함.

  • 클래스에 사용하면 해당 클래스는 다른 클래스가 상속받을 수 없게 됩니다.
    메소드에 사용하면 해당 메소드는 오버라이딩(overriding)을 통한 재정의를 할 수 없게 됩니다.

  • 상속 => private 멤버들을 제외한 모든 메소드를 상속 가능함.

Static 제어자

  • 공통의 의미, 변수에 사용하면 해당 변수를 클래스 변수로 만들어줌, 메소드에 사용시 클래스 메소드로 만들어줌.
  1. 프로그램 시작시 최초에 단 한 번만 생성되고 초기화됩니다.
  2. 인스턴스를 생성하지 않고도 바로 사용할 수 있게 됩니다.
  3. 해당 클래스의 모든 인스턴스가 공유합니다.

Abstract 제어자

  • 선언부만 있고 구현부가 없는 메소드, 클래스

  • 또한, 자바에서는 제어자의 특성상 몇몇 제어자는 함께 사용할 수 없습니다.

  1. 클래스에 final과 abstract는 함께 사용할 수 없습니다.
    : final 제어자를 가지는 클래스는 다른 클래스가 상속받을 수 없게 되며, abstract 제어자를 가지는 클래스는 다른 클래스가 상속해서 오버라이딩해야만 사용할 수 있으므로, 이 두 제어자는 클래스에 함께 사용할 수 없습니다. => abstract는 상속후 구현해야함.
  1. 메소드에 static과 abstract는 함께 사용할 수 없습니다.
    : abstract 제어자를 가지는 메소드는 선언부만 있고 구현부가 없는 메소드인데, static 제어자를 가지는 메소드는 인스턴스를 생성하지 않고도 바로 사용할 수 있어야 하므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
  1. 메소드에 private과 abstract는 함께 사용할 수 없습니다.
    : abstract 제어자를 가지는 메소드는 다른 클래스가 상속하여 오버라이딩해야만 사용할 수 있는데, private 제어자를 가지는 메소드는 자식 클래스에서 접근할 수 없게 되므로, 이 두 제어자는 메소드에 함께 사용할 수 없습니다.
  1. 메소드에 private과 final은 함께 사용할 필요가 없습니다.
    : 메소드에 사용된 final 제어자와 private 제어자는 모두 해당 메소드가 오버라이딩을 통한 재정의를 할 수 없다는 의미를 가지므로, 둘 중에 하나만 사용해도 의미가 충분히 전달될 수 있습니다.

ref) TCP School 22~36장
http://www.tcpschool.com/java/java_modifier_ectModifier

profile
응애 나 애기 개발자

1개의 댓글

comment-user-thumbnail
2023년 7월 21일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기