Home [Java 프로그래밍] 3강 - JAVA 기본 문법
Post
Cancel

[Java 프로그래밍] 3강 - JAVA 기본 문법

💡해당 게시글은 방송통신대학교 김희천 교수님의 'Java 프로그래밍' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • 같은 유형의 자료 집단을 표현하기 위한 배열의 사용 방법을 살펴봄
  • 문자열을 다룰 때 사용하는 String클래스의 기본 사항을 알아보고 문자열과 관련된 형변환을 학습함
  • 프로그램에서 키보드나 파일로부터 데이터를 입력받는 방법을 학습하고 클래스 정의 문법과 객체 생성 방법을 확인함



학습 목표


  • 프로그램에서 배열을 선언하고 사용 가능함
  • 문자열의 덧셈 연산과 형변환을 이해할 수 있음
  • 간단한 입출력 기능을 프로그램에 추가 할 수 있음
  • 클래스를 정의 할 수 있음
  • 클래스와 데이터필드의 접근 제어자에 관해 설명할 수 있음



강의록


배열

배열

  • 같은 자료형의 원소를 정해진 개수만큼 가지고 있는 객체
    • 원소들의 묶음
    • 배열의 크기는 선언할 때가 아닌 배열이 초기화 또는 생성될 때 정해짐
    • 숫자 인덱스(첨자) 사용해 특정 원소를 다룸
  • 배열의 선언
    • 선언할 때 크기 지정 불가
    • 형식
      • 자료형[] 변수이름;
      • 자료형 변수이름[];
    • ex) 1차형 배열

      1
      2
      
        int[] a; 
        int b[]; 
      
    • ex) 2차형 배열

      1
      2
      3
      
        int[][] c; 
        int d[][]; 
        int[] e[]; 
      
    • ex) 오류

      1
      
        int f[10]; 
      
  • 대표적인 참조형(클래스, 인터페이스, 배열)
    • 배열 원소에 대한 주소 값만 가지고 있음
    • 실제 데이터가 들어갈 공간 할당 받아 사용

배열의 초기화

  • 선언과 동시에 중괄호 이용해 초기 값 지정
    • 자동으로 메모리 공간 확보
    • 초기화 또는 생성 과정 거쳐야 배열의 원소 사용 가능
    • ex) 선언과 동시에 초기화

      1
      
        int a[] = {2, 3, 5, 7, 11};
      

      image.png

      1
      
        int anArray[][] = { {1, 2, 3}, {4, 5, 6} }; 
      

      image.png

    • ex) 오류

      1
      
        int b[]; b = {4, 5, 6};
      

배열의 생성

  • 배열의 원소가 사용할 메모리 공간 생성
    • new연산자 이용
      • 배열의 크기 정하고 메모리 공간 확보
      • new연산자는 메모리의 주소 값 리턴
      • 원소가 숫자인 경우 0, 참조형인 경우 null로 자동 초기화
  • ex) 선언과 생성

    1
    2
    3
    
      int a[] = new int[3];
      int b[]; b = new int[10];
      int anArray4[][] = new int[3][2];
    

배열의 크기

  • 배열은 크기를 가지는 내장 속성 length가지고 있음

    1
    2
    3
    4
    5
    6
    7
    8
    
      public class Main {
          public static void main(String args[]) {
              int twoArray[][] = { {0, 1}, {10, 11, 12} }; // 선언과 동시에 초기화
              for (int i = 0; i < twoArray.length; i++)
                  for (int j = 0; j < twoArray[i].length; j++)
                      System.out.println(twoArray[i][j]);
          }
      }
    

    image.png

    • 형식 : 배열이름.length

문자열

String클래스

  • String클래스는 문자열을 표현하고 처리하기 위한 참조형
  • String형의 변수는 참조형이나 기본형 변수처럼 사용 가능
    • 참조형 변수는 선언 후 new연산자 이용해 실제 데이터 들어갈 공간 할당 받아 써야 함
  • 문자열 리터럴
    • 이중 따옴표를 사용
      • ex) 기본형 변수처럼 사용 가능

        1
        
          String s1 = "Java";
        
      • ex) 생성자 사용

        1
        
          String s2 = new String("Java");
        
    • 참조형 변수에는 null이라는 특별한 값 지정 가능

      1
      2
      3
      
        if (s1 != null ) { 
              
        }
      

문자열의 +연산자

  • 두 문자열을 연결하는 것
  • (문자열 + 기본형) 또는 (문자열 + 다른 참조형)도 가능
    • +연산자 사용 시 기본형(또는 다른 참조형) 값은 문자열로 자동 형변환 가능
  • print()println()에서 자주 사용
    • 1개 매개변수를 문자열로 바꿔 출력함
    • System.out은 화면 출력을 위한 객체

      1
      2
      3
      
        System.out.println("result =" + " " + result);
        System.out.println('A' + 0); // 문자 char + 숫자 int = 65 
        System.out.println("A" + 0); // 문자열 String + 숫자 int = A0
      

Scanner클래스와 입출력

Scanner클래스

  • 키보드(표준 입력)나 파일로부터 다양한 자료 입력 받을 때 사용
    • 기본적으로 공백 문자로 구분되는 단어(토큰) 단위로 입력
    • 문자열이나 기본형 값의 입력 위해 next()또는 nextInt()와 같은 입력 메소드 제공
      • ex) 단어 입력

        1
        
          next()
        
      • ex) 단어 int 값으로 해석

        1
        
          nextInt()
        
  • 클래스에 관한 API 설명 페이지
  • 키보드에서 입력을 받는 Scanner객체 만들기
    • System.in이용해 Scanner객체 만들고 사용

      1
      2
      
        Scanner sc = new Scanner(System.in); // 인자로 표준 입력 이용해 객체 생성
        String name = sc.next(); // 객체 변수로 단어 입력 받음
      

Scanner클래스를 사용한 입력

  • Scanner클래스의 입력용 메소드

    1
    2
    
      Scanner s = new Scanner(System.in);
      String name = s.next();
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      import java.util.Scanner;
        
      public class ScannerTest {
          public static void main(String[] args) {
              Scanner sc = new Scanner(System.in); // scanner 객체 생성
              if (sc.hasNextInt()) { // int 값이 있을 경우 true 반환
                  System.out.println(sc.nextInt());
              } else {
                  System.out.println("It's not Integer");
              }
          }
      }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
      import java.util.Scanner;
        
      public class ScannerTest2 {
          public static void main(String[] args) {
              Scanner sc = new Scanner(System.in); // scanner 객체 생성
              while(sc.hasNextInt()) { // 단어 입력 시 검사
                  System.out.println(sc.nextInt());
              }
          }
      }
    
    • boolean hasNext()
      • next 수행 전 다음 단어가 있으면 true 반환
    • String next()
      • 다음 단어를 읽어 String으로 반환
    • boolean hasNextInt()
      • next 수행 전 다음 단어가 int 값이 있을 경우 true 반환
    • int nextInt()
      • 다음 단어를 읽어 int 값으로 반환
    • boolean hasNextDouble()
      • next 수행 전 다음 단어가 double 값이 있을 경우 true 반환
    • double nextDouble()
      • 다음 단어를 읽어 double 값으로 반환
    • boolean hasNextLine()
      • next 수행 전 다음 라인이 있으면 true 반환
    • String nextLine();
      • 다음 라인을 읽어 String으로 반환

클래스 정의

클래스 정의

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

    1
    2
    3
    4
    5
    6
    
      [접근 제어자] class 클래스이름 [extends 부모클래스이름] [implements 인터페이스 이름]
          { // 클래스 정의
              <데이터 필드 선언>;
              <생성자 선언>;
              <메소드 선언>;
          }
    
    • 클래스 접근 제어자
      • 클래스 사용 시 어디서 접근 가능한지 지정
      • 생략, public, protected, private
    • 클래스 비접근 제어자
      • abstract, final
        • abstract클래스는 상속 가능
        • final클래스는 상속 불가능
  • 헤더와 몸체로 구성됨
    • 클래스 정의 내부에 존재함
  • 메소드 정의 문법

    1
    2
    3
    4
    
      [접근 제어자]반환형 메소드 이름([자료형 인자[, 자료형 인자]]) [throws 예외 이름]
          {
              <문장>
          }
    
    1
    2
    3
    4
    5
    
      class Circle {
          public double getArea() {
              return this.r * this.r * 3.14;
          }
      }
    

클래스의 정의와 사용

  • 클래스 정의에서 데이터 필드와 메소드
    • 인스턴스 변수(메소드)와 클래스 변수(메소드)
      • 개별 객체가 소유하는 인스턴스 변수와 인스턴스 메소드
      • 클래스에 속한 객체가 공유하는 클래스 변수(static변수, 정적 변수)와 클래스 메소드
    • 객체의 상태는 데이터 필드로, 행위는 메소드로 구현됨
    • 메소드는 저장된 데이터를 이용해 기능 수행
  • 클래스의 사용
    • 클래스형 변수를 선언할 때
      • 클래스는 객체의 자료형
      • ex)

        1
        
          Circle c;
        
    • 객체를 생성할 때
      • ex)

        1
        2
        
          c = new Circle();
          s = new String();
        
    • 상속 받아 클래스를 정의할 때

클래스의 접근 제어자

  • 클래스 접근 제어자의 의미
    • 클래스의 사용 범위를 제한하는 것
      • 생략, public, private, protected
      • privateprotected는 내부 클래스에서만 사용함
    • abstractfinal은 사용 범위를 제한하는 접근 제어자는 아님
  • 접근 제어자가 생략된 경우와 public class
    • 클래스 선언에서 접근 제어자가 생략된 class
      • 같은 패키지에 있는 다른 클래스에서 사용 가능
      • 패키지 접근 수준
    • public class로 선언된 경우
      • 모든 클래스에서 즉, 어디서나 사용 가능
  • 클래스 정의에서 데이터 필드나 메소드를 정의할 때도 접근 제어자를 사용
    • 데이터 필드를 사용할 수 있는 범위를 제한하는 것(정보 은닉)
    • 메소드의 접근 제어자도 의미가 같음
  • 데이터 필드 접근 제어자의 의미
    • private필드
      • 같은 클래스에서만 사용 가능
    • 접근 제어자가 생략된 필드
      • 같은 패키지에 있는 다른 클래스에서도 사용 가능
    • protected필드
      • 같은 패키지와 자식 클래스에서 사용 가능
    • public필드
      • 모든 클래스에서 사용 가능
  • 아래 4개의 클래스에서 Alpha 클래스의 어떤 멤버를 사용할 수 있는가? (Alpha는 public 클래스라 가정)

    Untitled

    image.png

  • ex)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
      class Circle {
          private double r; // 데이터 필드 선언 시에 접근제어자 사용 가능
          // r 은 Circle 클래스 안에서만 사용 가능
          public Circle(double a) { // 메소드 선언 시에 접근제어자 사용 가능
              r = a;
          }
    
          public double getArea() {
              return r * r * 3.14; 
          }
    
          public double getRadius() {
              return r;
          }
      }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      public class CircleArea {
          public static void main(String args[]) {
              Circle c = new Circle(5); // CircleArea2와 Circle 클래스가 같은 패키지 안에 있을 경우 사용 가능
    
              // System.out.println(c.r); // private 데이터 필드기 때문에 오류 발생
              System.out.println(c.getRadius());  // r 을 리턴값으로 가지고 있는 getRadius 메소드 호출해 사용
              System.out.println(c.getArea());
          }
      }
    

객체의 사용

클래스의 사용

  • 정의되어 있는 기존 클래스를 사용하는 경우
    • 상속을 위해 클래스를 사용할 때

      1
      2
      
        Class Csub extends Csuper {
        }
      
    • 클래스형 변수를 선언할 때

      1
      
        Circle c;
      
    • 객체를 생성할 때

      • new는 메모리 공간을 할당 받고, 생성자를 호출하며, 메모리 참조 값을 리턴하는 연산자

        1
        
          c = new Circle(5);
        

객체의 사용

  • 생성된 기존 객체를 사용하는 경우
    • 객체 변수를 사용하는 경우
      • 객체를 메소드의 인자로 전달하는 경우, 부모 유형 변수에 객체를 대입하는 경우 등
    • 객체 변수와 점(.) 연산자를 사용하여 멤버에 접근하는 경우
      • 객체가 소유하는 데이터(인스턴스 변수)를 읽거나 쓰기
      • 객체를 이용하여 메소드(인스턴스 메소드)를 호출하기
    • ex) 객체 c를 대입

      1
      
        Shape myShape = c;
      
    • ex) 객체 c를 전달

      1
      
        System.out.println(c);
      
    • ex) c의 r을 변경

      1
      
        c.r = 5;
      
    • ex) c에게 getArea()실행을 요청

      1
      
        c.getArea();
      

생성자

  • 객체가 생성될 때 자동으로 실행되는 메소드
    • 객체의 필드 값을 초기화하거나 메모리 할당 등의 작업
  • 객체 생성 방법은 new클래스이름(인자)

    1
    
      Circle c = new Circle(5);
    
    • new연산자를 이용하여 객체를 생성(메모리 할당)하고
    • 생성자가 호출(데이터 필드의 초기화)되면서
    • 객체의 참조 값을 변수에 대입(=)
  • 인자가 없는 생성자를 기본 생성자(default constructor)라고 함

생성자의 정의

  • 보통의 메소드와 정의 방법이 다름
  • 생성자는 new를 사용하여 객체를 생성할 때 호출됨
  • 생성자 정의 방법
    • 생성자 이름은 클래스 이름과 같음
    • 반환형을 지정할 수 없음
    • 한 클래스에서 여러 생성자를 정의할 수 있음(생성자 오버로딩)
      • 매개 변수의 개수와 매개 변수의 자료형으로 구분
    • 접근 제어자는 보통 public
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
      public class Circle2 {
          double r;
          public Circle2(double a) {
              r = a;
          }
        
          public double getArea() {
              return r * r * 3.14;
          }
        
          public double getRadius() {
              return r;
          }
      }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      package thethird;
        
      public class Circle2Area {
          public static void main(String args[]) {
              Circle2 c2 = new Circle2(5.0);
              System.out.println(c2.r);
              System.out.println(c2.getArea());
          }
      }
    

기본 생성자

  • 인자가 없는 생성자, 디폴트 생성자(default constuctor)
  • 클래스 정의에서 단 하나의 생성자 정의도 없다면 컴파일러가 다음과 같은 것을 자동으로 만들어줌

    1
    2
    
      public Circle() {
      }
    
    • 생성자 몸체의 첫 줄에 부모 생성자의 명시적 호출이 없다면, 다음 코드가 자동으로 들어감
      • 부모 클래스의 기본 생성자를 호출

        1
        
          super();
        
      • 따라서 부모 클래스에서 기본 생성자의 존재를 확인해야 함



학습 정리


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



연습 문제


  1. 다음 중 문법적으로 올바른 문장은 무엇인가?

    a.

    1
    
     int[][] c = new int[5][];
    
  2. int형 변수 i와 j의 값을 각각 출력하기 위해 적당한 출력문은 무엇인가?

    a.

    1
    
     System.out.println( i + " " + j );
    
  3. int형 변수 i와 j의 값을 각각 출력하기 위해 적당한 출력문은 무엇인가?

    image.png

    a. Gamma

[데이터 정보 처리 입문] 2강 - 데이터 입력과 점검

[운영 체제] 2강 - 프로세스와 쓰레드