ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • (5주차 30일) 배열, 클래스, 필드
    수업 내용 정리 2024. 6. 10. 17:46

    Java

    > 배열(Array)

    • 배열은 같은 타입의 데이터를 연속된 공간에 나열시키고, 각 데이터에 인덱스(index)를 부여해 데이터를 읽거나, 데이터를 저장하는 방법을 제공한다.
      1. 배열 변수의 선언: 변수와 마찬가지로 배열을 사용하기 위해서는 배열 변수를 선언해야 한다.
      2. 배열 생성 및 초기화
        - new 연산자로 배열 생성 및 초기화
        - 값 목록으로 배열 생성 및 초기화
    • 배열의 저장 구조
      1. 배열 변수는 참조 변수이다. 배열 변수는 Stack 영역에 생성된다.
      2. new 자료형[배열 크기] 구문을 실행하면 Heap 영역에 배열을 생성하고, 배열의 시작 주소를 반환한다.
      3. new 자료형[] {값, 값, 값, ... } 또는 {값, 값, 값, ... } 구문을 실행하면 주어진 값들을 요소로 가지는 배열을 Heap 영역에 생성하고, 배열의 시작 주소를 반환한다.
      4. new 자료형[배열 크기] 구문으로 배열을 생성할 경우 배열은 자동적으로 기본값으로 초기화된다.
      5. null(널)은 참조형 변수가 Heap 영역의 객체를 참조하지 않는다고 뜻하는 값이다.
      6. null 값을 가지고 있는 참조 변수를 사용하면 NullPointerException이 발생한다.

    • 2차원 배열의 구조


    > 열거 타입(Enumeration Type)

    • 데이터 중 한정된 값만을 갖는 데이터 타입을 열거 타입이라 한다.
    • 열거 상수는 모두 대문자로 작성하는 것이 관례이며, 클래스와 동일하게 소스 파일을 생성해야 한다.
    • 열거 상수는 단독으로 사용할 수 없고 반드시 열거 타입.열거 상수로 사용된다.
    Week today = Week.FRIDAY;
    • 열거 타입의 열거 상수에 다른 속성을 추가할 수 있다.
      1. 열거 상수의 괄호()를 넣고 추가로 속성을 작성한다.
      2. 열거 타입에 필드를 설정하고 Getter을 통해 읽어올 수 있다.
    package com.beyond.enumeration.practice;
    
    public enum Week {
        MONDAY("월요일", "월"),
        TUESDAY("화요일", "화"),
        WEDNESDAY("수요일", "수"),
        THURSDAY("목요일", "목"),
        FRIDAY("금요일", "금"),
        SATURDAY("토요일", "토"),
        SUNDAY("일요일", "일");
    
        private final String name;
        private final String shortname;
    
        //열거 타입의 생성자는 반드시 private으로 선언해야 한다.
        private Week(String name, String shortName) {
            this.name = name;
            this.shortname = shortName;
        }
    
        //열거 타입의 name 값을 읽어오는 메소드
        public String getName() {
            return this.name;
        }
    
        //열거 타입의 shortName 값을 읽어 오는 메소드
        public String getShortname() {
            return this.shortname;
        }
    
    }

     

    클래스(Class)

    > 객체

    • 객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성과 기능을 가지고 다른 것과 식별이 가능한 것을 말한다. (ex. 유형, 무형, 개념 등)
    • 객체와 클래스
      1. 클래스는 객체의 특성(속성, 기능)을 정의하는 설계도이다.
        • 객체의 속성은 필드를 통해서 정의한다.
        • 객체의 기능은 메소드를 통해서 정의한다.
      2. 클래스로부터 메모리에 생성된 객체를 해당 클래스의 인스턴스(Instance)라고 한다.
      3. 객체(Object)는 프로그램에서 구현할 대상으로 이를 구현하기 위한 설계도가 클래스(Class)이고, 클래스로부터 메모리에 생성된 실체가 인스턴스(Instance)이다.

    > 객체 지향 프로그래밍(OOP, Object-Oriented Programming)

    • 프로그램을 개발하는 기법으로, 객체들을 만들고 객체들을 연결해서 프로그램을 완성하는 기법
    • 객체 지향 프로그래밍 특성을 지원하는 언어를 객체 지향 프로그래밍 언어라 한다.

    > 클래스 선언

    • 클래스 선언: [접근 제한자] [예약어] class 클래스명 { ... }
      1. 클래스명은 자바의 식별자 작성 규칙에 따라 만들어야 한다.
      2. 소스 파일의 이름은 반드시 선언된 클래스 이름과 같아야 한다.
      3. 접근 제한자는 public, default 설정이 가능하다.
    • 클래스를 사용자 정의 자료형이라고 표현하기도 한다.
    • 클래스의 구성 멤버로 필드(Field), 메소드(Method), 생성자(Constructor)가 정의된다.
    public class Member {
      // 필드, 생성자, 메소드 정의
      ...
    }
    • 예시
    package com.beyond.object.practice;
    
    /**
     * [클래스]
     *  클래스에서 사용 가능한 접근 제한자
     *  1. public
     *    : public으로 선언된 클래스는 아무 제약 없이 사용 가능하다.
     *  2. defauult
     *    : 동일 패키지에서는 제약 없이 사용 가능하지만, 다른 패키지에서는 제한된다.
     */
    public class Person {
        /**
         * 1. 필드 정의(객체의 속성)
         *  - 접근 제한자 설정
         *  - 대체로 상단에 작성
         */
        private String name;
        private int age;
    
        /**
         * 2. 생성자 정의(객체 생성 시 호출 - 초기화)
         *  - 클래스명과 동일해야 함
         *  - 반환 타입이 없음
         *  - 생성자 오버로딩 가능
         */
        public Person() {
            System.out.println("생성자 호출");
        }
    
        /**
         * 3. 메소드 정의(객체의 기능)
         *  - 매개변수 전달 가능
         */
        public void setName(String name) { //ex. "홍길동": 매개값, String name: 매개 변수
            this.name = name; //this: 객체 자기 자신(매개 변수와 필드명을 구분하기 위함)
        }
    
        public void setAge(int age) {
            this.age = (age >= 0) ? age : 0;
        }
    
        public void whoAreYou() {
            System.out.printf("안녕하세요. 저는 %s입니다. 나이는 %d세입니다.\n", name, age);
        }
    }

     

    > 객체 생성

    • 객체 생성: 클래스명 변수명 = new 클래스명();
      1. new 연산자는 힙 영역에 객채를 생성하고 객체의 주소값을 리턴
      2. 객체의 주소값은 참조 타입인 변수에 저장해서 객체를 사용할 수 있다.
    // new 연산자와 클래스의 생성자를 사용해서 객체를 생성한다.
    Member member = new Member();
    • 예시
    public class ObjectApplication {
        public static void main(String[] args) {
            Person hong = new Person();
            Person lee = new Person();
    
            hong.setName("홍길동");
            hong.setAge(24);
            hong.whoAreYou();
    
            lee.setName("이몽룡");
            lee.setAge(20);
            lee.whoAreYou();
        }
    }

    필드(Field)

    > 필드

    • 객체의 데이터, 상태 등 속성을 저장하는 공간이다.
      1. 선언 형태는 변수와 비슷하지만, 필드를 변수라고 부르지 않는다.
      2. 생성자와 메소드 전체에서 사용되며, 객체가 생성되고 소멸되기 전까지 객체와 함께 존재한다.

    > 필드 선언

    • 필드 선언: [접근 제한자] [예약어] 자료형 변수명[ = 초기값];
      1. 클래스 중괄호 블록 어디서든 존재 가능하다.
        단, 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없다.
      2. 접근 제한자는 public, private, default, protected 설정이 가능하다.
      3. 초기값은 선언 시 지정될 수 있고, 생략될 수도 있다.
        단, 초기값이 지정되지 않은 필드는 자동으로 기본 초기값으로 지정된다.
    public class Member {
      // 필드 정의
      public String name; // null
      private int age = 20;
      
      // 생성자, 메소드 정의
      ...
    }

     

    • 예시
    package com.beyond.field.practice;
    
    public class User {
        // 필드 선언
        public String id = "hong";
        private String password = "1234";
        String name = "홍길동";
    
        public void test() {
            System.out.println(id);
        }
    }

     

    > 필드 사용

    • 같은 클래스 내부에서는 생성자와 모든 메소드에서 필드 사용이 가능하다.
    • 같은 클래스가 아닌 외부에서 필드를 사용하려면, 클래스로부터 객체를 생성하고 필드 사용이 가능하다.
      1. 접근 제한자가 public인 경우, 도트(.) 연산자를 사용하여 필드에 접근할 수 있다.
    • 예시
    public class User {
        // 필드 선언
        public String id = "hong";
        private String password;
        String name = "홍길동";
    
        public void test(int number) { //매개변수
            /**
             * 1. 매개변수는 스택 영역에 생성될 때 함께 생성됨.
             *    실행흐름이 끝나면, 스택 영역이 소멸되면서 함께 소멸됨
             *    지역변수와 유사하다.
             * 2. 지역변수의 경우, 초기화가 필요하지만,
             *    매개변수의 경우 메소드를 호출할 때 값을 반드시 넘겨줘야 하므로
             *    매소드 내에서 초기화할 필요가 없다.
             * 3. 지역변수에는 접근 제한자를 붙이지 않는다.
             */
            int num = 20; //지역변수
    
            System.out.println("num = " + num);
            System.out.println("number = " + number);
    
            /**
             * 필드는 클래스 전역에서 사용이 가능하다. (생성자, 메소드)
             * 필드가 초기화되지 않은 경우, 기본값으로 초기화
             */
            System.out.println("password = " + password);
        }
    }