본 게시글은 대학 전공수업을 들으며 노션에 정리한 내용을 블로그로 옮긴 것으로, 에디터 차이로 인해 일부 수식, 서식, 내용 등이 빠져 있을 수 있습니다.

노션 웹을 통해 최적화된 형태로 읽으시길 권해드립니다.(➡️ 노션 링크)

3강 - 배열, String, Scanner, 클래스, 접근제어자, 생성자

배열

  • 코드

      package lecture03;
    
      public class Array {
    
        public static void main(String[] args) {
          //선언
          int[] a;
          String b[];
    
          //초기화
          /* new 연산자를 통해 메모리 공간 생성
           *  메모리 주소값을 리턴함
           * 원소가 숫자라면 '0', 참조형인경우 null 리턴 */
    
          a = new int[3];
          b = new String[4];
    
          //선언 + 초기화
          int c[] = {2, 3, 5, 7, 11};
    
          //출력
          System.out.println("a = " + a[0]); //0
          System.out.println("b = " + b[0]); //null
    
          for (int num : c) {
            System.out.println("num = " + num);
          }
    
          //2차원 배열
          int[][] matrix; // 2차원 배열 선언
          matrix = new int[3][3]; // 2차원 배열 초기화
    
          int[][] matrix2 = {
              {1, 2},
              {3, 4},
              {5, 6}
          };
    
          //배열의 크기
          System.out.println("matrix2.length = " + matrix2.length); //3행
          System.out.println("matrix2.length = " + matrix2[0].length); //2열
    
          // 배열 값 출력
          for (int i = 0; i < matrix2.length; i++) {
            for (int j = 0; j < matrix2[i].length; j++) {
              System.out.println("matrix2[" + i + "][" + j + "] = " + matrix2[i][j]);
            }
          }
    
        }
    
      }
    

String 클래스

문자열을 표현하고 처리하기 위한 참조형

String 변수는 참조형이나 시본형 변수처럼 사용할 수 있음.

  • 코드

      package lecture03;
    
      public class StringClass {
    
        public static void main(String[] args) {
          String str1 = "Java";
          String str2 = new String("Java");
    
          //str1과 str2의 주소값은 다르다.
          //주소값 비교
          System.out.println("str1 == str2 = " + (str1 == str2));
    
          //문자열 비교
          System.out.println("str1.equals(str2) = " + str1.equals(str2));
    
          //String의 + 연산자
          String str3 = str1 + str2;
          System.out.println("str3 = " + str3);
    
          // (문자열 + 기본형) or (문자열 + 다른 참조형)
          // +연산자 사용시 문자열로 자동 형변환
          String numStr = "100";
          int num = 0;
          System.out.println(numStr + num); // 1000이 출력
    
          //참고 : 작은 따옴표 + 정수 => 아스키코드 값으로
          System.out.println('A' + num); //165가 출력
    
    
  }
}

```

Scanner 클래스

키보드나 파일로 부터 다양한 자료를 입력 받음

Scanner 객체 생성 방법

Scanner sc = new Scanner(System.*in*);

  • 변수 sc로 new Scanner로 객체 생성

  • System클래스 안의 in이라는 스태틱 클래스 변수를 통해 키보드 입력 받음 (표준 입력 스트림)

  • 코드

      package lecture03;
    
      import java.util.Scanner;
    
      public class ScannerClass {
    
        public static void main(String[] args) {
          Scanner sc = new Scanner(System.in);
    
          System.out.print("단어 입력 :");
          String word = sc.next();
    
          sc.nextLine(); // 남아 있는 줄바꿈 문자를 처리
    
          System.out.print("문자열 입력 : ");
          String str = sc.nextLine();
    
          System.out.print("숫자(정수) 입력 : ");
          int num = sc.nextInt();
    
          System.out.print("실수 입력 : ");
          double doubleNum = sc.nextDouble();
    
          System.out.println("word = " + word);
          System.out.println("str = " + str);
          System.out.println("num = " + num);
          System.out.println("doubleNum = " + doubleNum);
        }
    
      }
    

클래스

정의

  • 동종 객체를 표현하기 위한 데이터필드(멤버 변수)와 메소드를 정의
  • 부모 클래스 상속, 인터페이스 구현, 추상 클래스, final 클래스 등을 정함

클래스 사용

인스턴스 변수(메소드)와 클래스 변수(메소드)

  • ‘개별 객체’가 소유하는 인스턴스 변수와 인스턴스 메소드 : 객체가 생성될 때 마다 초기화
  • ‘클래스에 속한 객체’가 공유하는 클래스 변수와 클래스 메소드

객체의 상태는 데이터 필드로 구현

행위와 기능은 메소드로 구현됨

아래 코드 참조시 이해하기 쉽다.

  • 코드 : Circle

      package lecture03;
    
      public class Circle {
    
        // 인스턴스 변수: 각 객체가 개별적으로 소유
        private int radius;
        private float pie = 3.14f;
    
        // 클래스 변수: 모든 객체가 공유
        private static int instanceCount = 0;
    
        // 생성자: 인스턴스 변수를 초기화하고, 클래스 변수 증가
        public Circle(int radius) {
          this.radius = radius;
          instanceCount++;
        }
    
        // 인스턴스 메서드: 인스턴스 변수에 접근 가능
        public double getArea() {
          return this.pie * this.radius * this.radius;
        }
    
        //----- getter/setter 메서드: 인스턴스 변수에 접근 가능 ------------------
        public int getRadius() {
          return radius;
        }
    
        public void setRadius(int radius) {
          this.radius = radius;
        }
    
        public float getPie() {
          return pie;
        }
    
        public void setPie(float pie) {
          this.pie = pie;
        }
    
        //----------------------------------------------------------------
        // 클래스 메서드: 클래스 변수에 접근 가능
        public static int getInstanceCount() {
          return instanceCount;
        }
      }
    
  • 코드 : CircleMain

      package lecture03;
    
      public class CircleMain {
    
        public static void main(String[] args) {
          Circle circle1 = new Circle(5); // 첫 번째 Circle 객체 생성
          Circle circle2 = new Circle(10); // 두 번째 Circle 객체 생성
    
          System.out.println("circle1 반지름: " + circle1.getRadius());
          System.out.println("circle1 넓이: " + circle1.getArea());
    
          System.out.println("circle2 반지름: " + circle2.getRadius());
          System.out.println("circle2 넓이: " + circle2.getArea());
    
          // 클래스 메서드 호출: 모든 객체가 공유하는 클래스 변수
          System.out.println("생성된 Circle 객체 수: " + Circle.getInstanceCount());
    
      //    System.out.println(circle2.radius);
          // java: radius has private access in lecture03.Circle 발생
        }
      }
    

언제 사용하나?

  • 클래스형 변수를 선언할 때 : Circle circle;
  • 객체를 생성할 때 : Circle circle = new Circle(5);
  • 상속받아 클래스를 정의할 때 Class Student extends Person

클래스 접근제어자

: 클래스의 사용 범위를 제한하는 것.(for 정보은닉)

클래스 외에도 데이터필드(멤버변수/인스턴스변수/속성), 메소드를 정의할 때도 접근제어자 사용.

접근제어자 종류

(생략), public, private, protected

private과 protected는 내부클래스에서만 사용

  • default: 같은 패키지 내의 다른 클래스에서 사용 가능
  • public : 모든 클래스에서 어디서나 사용 가능.
  • private : 같은 클래스 내에서만 접근 가능. *접근을 위해 getter, setter는 public이다!
  • protected : 같은 패키지 내의 다른 클래스와 자식 클래스에서만 접근

위 코드에서, 다른 클래스에서 System.out.println(circle2.radius); 실행시 java: radius has private access in lecture03.Circle 에러 발생

public → default → protected → private

https://iq.opengenus.org/public-private-protected-in-java/

객체의 사용

  • 생성된 기존 객체를 사용하는 경우
    • Shape myShape = circle; //부모 변수에 객체를 대입
    • 객체를 메소드에 전달
    • circle.r = 5; // 점 연산자로 멤버에 접근해 데이터를 읽음
    • circle.getArea(); //점 연산자로 메소드 호출

생성자

  • 객체가 생성될 때 자동으로 실행되는 메소드
    • 객체 필드 값을 초기화하거나 메모리 할당 등의 작업
  • new 클래스이름(인자…)
Circle c = new Circle(5);
  • ⇒ new연산자로 객체를 생성(메모리 할당)
  • ⇒ 생성자 호출(데이터필드 초기화)
  • ⇒ 객체 참조값을 변수에 대입. (’=’ 를 통해) : c에다 Cricle(5) 주소값 대입

정의 방법

  1. 생성자 이름은 클래스와 같음
  2. 반환형 지정x (반환형 지정시 생성자가 아님)
  3. 한 클래스에서 여러 생성자를 정의할 수 있음 : 생성자 오버로딩
    • 매개변수 갯수와 매개변수 자료형으로 구분함
  4. 접근제어자는 보통 public

기본 생성자

인자가 없는 생성자. default constructor

  • 클래스에는 반드시 생성자가 있어야함.
    • 따라서 단 하나의 생성자 정의가 없을 때, public Cirlce() {} 과 같은 걸 자동으로 만들어 준다.
  • 자식 클래스의 경우 생성자 첫줄에 명시적 호출이 없다면 super(); 가 자동으로 들어간다. ⇒ 따라서 부모클래스에서 기본 생성자의 존재를 확인 해야함!

요약

  • 배열은 원소의 초기화 과정이나 원소의 생성 과정을 거쳐야만 사용할 수 있다.
  • ‘배열이름.length’을 사용하여 배열의 크기를 표현할 수 있다.
  • 문자열 변수나 리터럴에 대해 + 연산을 적용한 결과는 두 문자열이 연결된 문자열이다.
  • Scanner 클래스를 이용하면 키보드나 파일로부터 편리하게 문자열(또는 기본형 값)을 입력받을 수 있다.
  • 클래스를 정의할 때, 내부 클래스가 아니라면 클래스의 접근 제어자로서 생략과 public만 지정할 수 있다.
  • 정의 부분에서 접근 제어자가 생략된 클래스나 데이터 필드는 ‘해당 클래스’ 외에 ‘같은 패키지의 다른 클래스’에서만 사용할 수 있다.
  • 생성자를 정의하려면 이름을 클래스 이름과 같게 하고 반환형을 지정하지 않는다.