본문 바로가기

Android ᙏ̤̫͚/JAVA Algorithm

Chapter 02. 기본 자료구조

 

chapter 02 - 1 배열

 

자료구조 (data structure)

데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계

 

 

배열 (array)

같은 자료형의 변수로 이루어진 구성 요소의 집합

 

  - 가장 기본적이고 간단한 자료구조

  - int[] a; // int 타입 배열 선언

  - a = new int[5]; // a는 길이가 5인 int 타입 배열 참조

  - int[] a = new int[5]; // 배열 선언과 참조 한번에 가능

  - int[] a = {1, 2, 3, 4, 5}; // 배열 초기화(array initializer) 사용하여 배열 생성과 구성 요소 초기화

  - 구성 요소

     - array[index] // 인덱스 통해 구성 요소에 접근 가능

     - array.length // 배열의 길이 파악 가능

     - 구성 요소의 자료형에 따라 'Type형 배열'이라고 부름 (ex int형 배열)

  - array.clone( ) // 배열 복제

  - 배열 요소 역순 정렬 / 두 값의 교환

 

 

 

  - 연습문제

     - 실습 예제 수정하여 키와 사람 수 난수로 생성하는 프로그램

        (ⓒⓞⓓⓔ) ex01.java

     - 배열 요소 역순 정렬하는 과정 나타내는 프로그램

        (ⓒⓞⓓⓔ) ex02.java

     - 배열 a의 모든 요소의 합 구하여 return하는 프로그램 (메서드 작성)

        (ⓒⓞⓓⓔ) ex03.java

     - 배열 b의 모든 요소를 배열 a에 복사하는 프로그램 (메서드 작성)

        (ⓒⓞⓓⓔ) ex04.java

     - 배열 b의 모든 요소 배열 a에 역순으로 복사하는 프로그램 (메서드 작성)

        (ⓒⓞⓓⓔ) ex05.java

 

 

기수 변환

  - 변환하는 정수, 기수, 변환 후 자릿수에 대한 변수 필요

  - 변환 후 각 자리 숫자 넣어두는 문자 배열 필요

  - 연습문제

     - 배열의 앞쪽에 윗자리 넣어두는 프로그램 (메서드 작성)

        (ⓒⓞⓓⓔ) ex06.java

     - 기수 변환 과정 나타내는 프로그램

        (ⓒⓞⓓⓔ) ex07.java

 

 

소수의 나열

  - 어떤 정수 이하의 소수를 모두 나열하는 알고리즘

  - 처음부터 끝까지 탐색해보며 소수 여부 판별하여 모두 나열

    → 2를 소수에 포함한 후 3이상 홀수만 탐색하며 소수 여부 판단하여 모두 나열

    → n의 제곱근 이하의 어떤 소수로도 나누어떨어지지 않는다면 소수라도 판단하여 모두 나열

 

 

다차원 배열

  - 가장 간단한 것이 2차원 배열로, 어떠한 타입의 배열을 구성 자료형으로 하는 배열

  - 3차원 배열의 경우, 2차원 배열을 구성 자료형으로 하는 배열이라고 할 수 있음

  - 복제하는 경우 최상위의 1레벨의 배열만 복제되고, 그 아래 레벨의 배열은 공유만 됨. 

 

 

한 해의 경과 일 수를 계산하는 프로그램

  - 2차원 배열에 각 달의 일 수 저장 (윤년 / 평년 구분하여)

    → 윤년 여부에 따라 일 수 구하여 return하는 프로그램

  - 연습문제

     - 실습 예제 수정하여 변수 없이 한 해의 경과 일 수 계산하는 프로그램 (메서드 수정 / while문 사용)

        (ⓒⓞⓓⓔ) ex08.java

     - 그 해의 남은 일 수를 구하는 프로그램 (메서드 작성)

        (ⓒⓞⓓⓔ) ex09.java

 

 

 

chapter 02 -2 클래스

임의의 데이터형을 자유롭게 조합하여 만들 수 있는 자료구조

 

- 클래스 선언

   - class XYZ {

         int x;

         long y;

         double z;

     }

   - XYZ a; // XYZ형의 클래스형 변수 a 선언

   - a = new XYZ( ); // XYZ형의 클래스 인스턴스 생성

   - XYZ a = new XYZ( ); // 변수와 인스턴스 생성 한꺼번에 선언 가능

 

- 생성자   - XYZ(int x, long y, double z) {

         this.x = x;

         this.y = y;

         this.z = z;

     }

 

연습문제

     - 시력 분포를 그래프로 출력하는 프로그램 (사람 수만큼 * 반복하여 출력)

        (ⓒⓞⓓⓔ) ex10.java

     - 년월일 필드 클래스 생성하고 생성자와 n일 뒤 날짜 반환, n일 앞 날짜 반환하는 프로그램(메서드 작성)

        (ⓒⓞⓓⓔ) 

 

클래스 정리

  1. 클래스 본체에서 선언

      - 멤버 (필드, 메서드, 중첩 클래스, 중첩 인터페이스)

      - 클래스 / 인스턴스 초기화

      - 생성자

  2. 필드 / 메서드 / 생성자 : public / protected / private 접근 제한자 지정 가능

  3. 메서드 / 생성자 다중 정의 가능(오버로드)

  4. final 선언 필드는 한번만 값 대입 가능

  5. 생성자 : 새로 생성한 인스턴스의 초기화 위해 사용

 

- 클래스 종류

   - 공개 클래스 (public class)

   - final class

     - 서브 클래스 생성 불가, 말 그대로 final class

   - 파생 클래스(subclass)

     - subclass extends superclass // 선언 필수

     - 선언하지 않는다면 Object 클래스가 상위 클래스가 됨.

   - interface

     - class A implements interfaceX // 인터페이스 구현 위해 선언 필요

   - 추상 클래스 (abstract class)

     - 추상 메서드 가질 수 있지만, 불완전한 상태라 인스턴스 생성 불가능

     - subclass에서 추상 메서드 구현해야 함

   - 중첩 클래스 (nested class)

     - member class : 선언이 다른 클래스 혹은 인터페이스 선언에 둘러싸인 클래스

     - inner class : static 선언 불가능, 정적 멤버 선언 불가능, 정적 초기화, 멤버 인터페이스 선언 불가능

     - local class : 이름이 주어진 중첩 클래스, 내부 클래스

 

 

 

** 참고 내용 **

  값을 대입하지 않은 지역변수

   - 지역변수는 초기화되지 않기 때문에 값을 대입하지 않으면 컴파일 에러 발생

 

  접근 제한자

   객체의 멤버에 대한 접근을 제한하는 경우

 

   - 제한자 종류

     ① public : 모든 접근 허용  

     ② protected : 같은 패키지 (폴더)의 객체, 상속 관계의 객체 접근 허용

     ③ default : 같은 패키지 (폴더)의 객체 접근 허용

     ④ private : 현재의 객체 안에서만 접근 허용

   - 접근 제한자 사용

     ① 클래스 : public, default

     ② 생성자 : public, protected, default, private

     ③ 멤버 변수 : public, protected, default, private

     ④ 멤버 메서드 : public, protected, default, private

     ⑤ 지역 변수 : 접근 제한자 사용 불가

 

  난수 생성

   - import java.util.Random;

   - Random random = new Random( ); // 새로운 난수 생성기 생성

     Random random = new Random(n); // n이라는 seed 값 자동으로 결정하여 난수 생성

   - 메서드 호출 

     - random.nextBoolean( ); // boolean형 난수 생성

     - random.nextInt( );

     - random.nextInt(n);

     - random.nextLong( );

     - random.nextDouble( );

     - random.nextFloat( );

 

  import 형 선언

   - 간단한 클래스 이름만으로 클래스 사용 가능 

   - ex) import 선언이 없었다면 Scanner 사용 시마다 java.util.Scanner로 표기해야함. 

 

  전위형 증가 연산자와 후위형 증가 연산자

   - 전위형 증가 연산자 (++a)

     - 식 평가 전에 피연산자 값 증가시킴

   - 후위형 증가 연산자 (a++)

     - 식 평가 후 피연산자 값 증가시킴

 

  String 클래스

   - java.lang 패키지에 속한 문자열 나타내는 클래스

   - 변수, 필드(field), 생성자(constructor), 메서드(method) 존재

   - 외워야 하는, 기억해야 하는 메서드

     - char charAt(int i) // index i인 곳의 문자 return

     - int length( ) // 문자열의 문자 수 return

     - boolean equals(String s) // 문자열 s와 같은지 조사하여 true, false return

 

  확장 for문

   - for (double i : a) // 배열 a의 처음부터 끝까지 모든 요소를 한 개씩 스캔함을 의미

   - 배열의 길이 조사할 필요 없음

   - index 값이 필요하지 않는 경우 확장 for문으로 구현하는 것이 더 좋음

 

 

 

'Android ᙏ̤̫͚ > JAVA Algorithm' 카테고리의 다른 글

Chapter 06. 정렬 (1)  (0) 2021.01.21
Chapter 05. 재귀 알고리즘  (0) 2021.01.16
Chapter 04. 스택과 큐  (0) 2021.01.13
Chapter 03. 검색  (0) 2021.01.13
Chapter 01. 기본 알고리즘  (0) 2021.01.08