교육 (Today I Learned)/Hanaro

[Hanaro] 39일차 / Java (Array, Class, method, 접근 제어자, 싱글톤 패턴)

Bay Im 2024. 3. 12. 17:45

04 Java의 기본 문법 이해 - 제어문과 배열

  • 1차원 배열
    • 배열의 특징
      • 동일한 자료형만 묶어서 저장 가능
      • 생성 시 크기를 지정, 이후 크기는 변경 불가
    • 배열의 선언
      • 자료형[] 변수명; ← (해당 방식을 많이 사용!)
        • ex) int[] a;
      • 자료형 변수명;
        • ex) int a[];
    • 배열의 객체 생성
      • 객체 생성 시 개수가 지정되어야 함.
      • 힙(Heap) 메모리에 생성
      • 선언과 동시에 객체 생성 가능
        • ex) int[] a = new int[3];
    • 배열 객체의 값 대입 및 읽기
      • 값 대입
        • 참조변수명[인덱스] = 값;
          • ex) a[0] = 1;
      • 값 읽기
        • 참조변수명[인덱스]
          • ex) sout(a[0]); ⇒ 1 출력
    • 배열의 생성과 동시에 값 대입
      • 자료형[] 참조변수명 = new 자료형[]{값, 값, …, 값}ㅣ
        • ex) int[] a = new int[]{3, 4, 5};
      • 자료형[] 참조변수명 = {값, 값, …, 값}; ← (해당 방식을 많이 사용!)
        • ex) int[] a = {3, 4, 5};
      • 위의 두 방법의 차이점
        • 첫 번째 방법은 선언과 값의 대입이 분리 가능하고, 두 번째 방법 불가능하다. (new를 안했기 때문)
    • 배열 객체의 초기화
      • 초기값을 부여하지 않는 경우 빈칸으로 존재
      • 0이나 null은 읽기 가능하지만 초기값은 읽기 불가능
    • 참조 자료형의 배열 특징
      • 변수 복사 시 값이 아닌 위치가 복사된다.
      • 기본자료형은 값의 복사
    • 배열의 길이
      • 배열변수명.length 사용
    • 배열 데이터 읽기
      • for-each 문 이용
        • for(자료형 변수: 묶음참조자료형) { … }
        • 예시
        • for (int num : arrNum1) {
               System.out.println(num);
          }
      • for 문 이용
        • 예시
        • for (int i = 0; i < arrNum1.length; i++) {
              System.out.println(arrNum1[i]);
          }
      • Arrays.toString() 이용
        • Array.toString(참조변수명)
    • 배열의 정렬
      • 오름차순
        • Array.sort(참조변수명); 이용
      • 내림차순
        • Integer 타입으로 변경 후 Arrays.sort(참조변수명, Collections.reverseOrder());
  • 2차원 배열
    • 2차원(정방행렬) 배열
      • 가로 세로 방향으로 정렬된 배열
    • 2차원 배열의 선언
      • 자료형[][] 변수명 ← (해당 방식을 많이 사용!)
        • ex) int[][] a;
      • 자료형 변수명[][]
        • ex) int a[][];
      • 자료형[] 변수명[]
        • int[] a[];
    • 2차원 배열의 객체 생성
      • 배열 객체의 생성 이후 값 대입
        • 자료형[][] 참조변수명 = new 자료형[행의길이][열의길이];
          • ex) int[][] a = new int[2][3];
          • a[0][0] = 1;
      • 행과 열의 값을 따로 생성
      • 자료형과 대입할 값만 입력
        • 자료형[][] 참조변수명 = new 자료형[][] {{값, 값, 값}, {값, 값, 값}};
          • ex) int[][] a = new int[][]{{1, 2, 3}, {4, 5, 6}};
      • 대입할 값만 입력 ← (해당 방식을 많이 사용!)
        • 자료형[][] 참조변수명 = {{값, 값, 값}, {값, 값, 값}};
          • ex) int[][] a = {{1, 2, 3}, {4, 5, 6}};
    • 2차원 배열의 길이
      • 행의 길이
        • 2차원배열.length
      • 열의 길이
        • 2차원배열[0].length
    • 2차원 배열의 출력
      • for 문 이용
        • 예시
        • for (int i = 0; i < nums.length; i++) {
              for (int j = 0; j < nums[i].length; j++) {
                 System.out.print(nums[i][j] + " ");
              }
              System.out.println();
          }
      • for-each 문 이용
        • 예시
        • for(int[] m: a) {
          	for(int n: m) {
          			System.out.println(n);
          	}
          }

 

05 OOP 이해 및 실습 - OOP 기본 학습

  • 객체 지향 프로그래밍
    • OOP (Object Oriented Programming)
    • 부품 객체 먼저 만들고 이것들을 하나씩 조립해 프로그램을 만드는 기법
  • 객체 (Object)
    • 무리적으로 존재하는 것, 속성과 동작을 가지는 것
    • 객체는 필드(속성)과 메소드(동작)로 구성된 객체로 모델링 가능
  • 객체간의 관계
    • 집합 관계
      • 완성품과 부품의 관계
    • 사용 관계
      • 객체가 다른 객체를 사용하는 관계
    • 상속 관계
      • 종류 객체와 구체적인 사물 객체 관계
  • 객체와 클래스
    • 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의되어 있다.
    • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.
    • 하나의 클래스로부터 여러개의 인스턴스를 만들 수 있다.
      • 클래스가 붕어빵 틀이라면, 객체는 만들어지는 붕어빵들..
      • 객체(Object) = 클래스의 인스턴스(instance)
  • 절자지향과 객체지향
    • 절차지향형 프로그래밍
      • 순서에 맞추어 단계적으로 실행하도록 명령어를 나열
    • 객체지향형 프로그래밍
      • 객체를 구성하고 객체 단위로 프로그래밍 (필드, 메서드)
  • 클래스 이름 규칙
    • 필수
      • 첫번째 글자는 숫자가 올 수 없다.
      • $, _ 외 특수문자 사용 불가
      • 자바 키워드 사용불가
    • 관례
      • 다른 단어의 첫글자는 대문자로 작성
      • 한 소스 파일당 하나의 클래스 선언
  • new 연산자
    • 객체 생성 역할, 생성 후 객체생성 번지 리턴
    • new 클래스(); 의 형태
      • 클래스()는 생성자를 호출하는 코드
      • 생성된 객체는 Heap 메모리 영역에 생성
  • 객체의 생성
    • 클래스 변수 = new 클래스(); 형태
  • 클래스의 구성 멤버
    • 필드 (Field)
      • 객체의 데이터가 저장되는 곳
      • ex) int fieldName;
    • 생성자 (Constructor)
      • 객체 생성시 초기화 역할
      • ex) ClassName() { … }
    • 메소드 (Method)
      • 객체의 동에 해당하는 실행 블록
      • ex) void methodName() { … }
  • static 예약어
    • 객체 생성없이 사용할 정적 변수(객체), 함수를 지정할 때 사용
      • ex) static int a = 100;
      • static void make() { … }
    • static 변수,함수는 new 인스턴스를 생성하지 않고 클래스 이름으로 바로 함수나 멤버변수 사용 가능
      • ex) 클래스이름.메서드이름();
    • 전역 변수로 클래스 가져올 수 있다. (메인 위 public static 클래스 클래스변수; 작성)
    • 프로그램 구동시 고정된 메모리 번지에 들어가고, 프로그램 종료시까지 변경되지 않는다.
    • 사용 이유
      • 시작점(Entry point)를 지정할 때 사용
      • 중요한 데이터를 안정적으로 저장할 때 주로 사용
      • 자주 사용하는 유틸성 클래스에 지정
  • void 예약어
    • 메서드를 생성할 때 return 값이 없는 경우 void 메서드이름() {…} 형식으로 사용
    • 만약 return 값이 있다면 void 대신 return 하는 값의 데이터 타입을 적어주기
  • this
    • this() 메서드
      • 자기 클래스 내부의 다른 생성자를 호출
      • 생성자 내부에서만 사용가능
      • 중괄호 안의 첫 줄에 위치해야함
    • .this
      • 자기 클래스 내부의 멤버변수 호출할 때 사용
      • 전역변수를 호출할 때 사용
        • ex) this.변수 = 값;
      • static 메서드 내에서는 this 사용 불가
  • 메서드의 구조
    • 접근지정자 객체생성없이사용 리턴타입 메서드이름 (매개변수) { 메서드 내용 }
      • ex) public static int sum(int a, int b) { … }
  • 메서드 오버로딩
    • 메서드의 이름이 같지만 매개변수의 데이터 타입과 개수를 다르게 함으로써 함수의 기능을 확장하는 것
  • 접근 제어자 (Access Modifier)
    • public
      • 동일 패키지의 모든 클래스와 다른 패키지의 모든 클래스에서 사용 가능
    • protected
      • 동일 패키지의 모든 클래스와 다른 패키지의 자식 클래스에서 사용 가능
    • default
      • 동일 패키지의 모든 클래스에서 사용 가능
    • private
      • 동일 클래스에서 사용 가능 (캡슐화)
      • Getter/Setter 함수를 통하여 접근하도록 허용
  • Getter/Setter
    • Getter
      • private 필드의 값을 리턴하는 역할
      • getFieldname() 형식
    • Setter
      • 외부에서 주어진 값을 필드 값으로 수정
      • setFieldName(타입변수) 형식
  • 싱글톤 객체 (Singleton pattern)
    • 프로그램 안에서 유일한 클래스 객체
    • new를 사용하여 여러개의 객체를 찍어낼 수 있지만 모두 주소값이 같은 객체를 만들어 낸다.
    • 유일한 객체가 필요한 이유는 유일한 정보를 저장하기 위함이다.
    • 싱글톤 생성
      • 예시
      • class SingletonClass {
            private static SingletonClass singleton;
        
            public static SingletonClass getInstance() {
                if (singleton == null) {
                    singleton = new SingletonClass();
                }
                return singleton;
            }
        }
        
        // 메인 영역(psvm)
        SingletonClass single1 = SingletonClass.getInstance();
        SingletonClass single2 = SingletonClass.getInstance();
        
        // 다른 객체 두개를 만들었지만 주소값은 같다.
        System.out.println(single1);
        System.out.println(single2);