Java

7월 15일 시험 준비 복습 1차원 배열, 2차원 배열, 클래스

최종군 2024. 7. 2. 16:54

 

6월 18일 

 

[배열] : [ 같은 자료형 ]의 [ 여러 개의 데이터(값)]을 저장하는 공간

: 배열의 데이터는 [ 인덱스 ]로 관리가 된다.

** 인덱스의 시작번호: [ 0 ] **

 

* 선언 표현식 

자료형[] 배열명;

 

할당 표현식

배열명 = new 자료형[배열 크기];

 

* 배열 선언과 동시에 할당

(1) 자료형[] 배열명 = new 자료형[] {값1, 값2, 값3, ...};

 

(2) 자료형[] 배열명 = {값1, 값2, 값3, ...};

 

(3) 자료형[] 배열명 = new 자료형[배열 크기];

배열명[인덱스번호(위치번호)] = 값1;

arry[0] = 값1;

 

int[] numbers = new int[3];

System.out.println(numbers);

// 출력 결과 : 0x123

 

배열 복사

(1) [ 얕은 복사 ]

: 주소 값만 복사하여 실제 데이터는 한 곳에서 관리.

데이터가 변경되면 복사된 배열에도 영향을 줌(반영이 됨)

int[] arr1 = new int[] {1, 2, 3};

int[] arr2 = arr1; 

 

 

(2) [ 깊은 복사 ] : 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사.

 

1) 반복문 사용

ex) int[] arr1 = new int[] {1, 2, 3};

int[] arr2 = new int[arr1.length];

for(int i=0; i < arr1.length; i++) {

arr2[i] = arr1[i];

}

(2) 복사본 배열 = 원본배열.clone();

 

[ 복사본 배열명 ] = Arrays.copyOf([ 원본 배열명 ], 복사할 길이);

System.arraycopy(원본배열명, 복사시작할인덱스, 복사본배열명, 복사본배열의 복사될 시작인덱스, 복사할갯수);

 


 

6월 19일 

 

(2) 깊은 복사 : 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사.

(1) 반복문 사용

ex) 아래 origin이라는 이름의 배열을 copy라는 이름의 배열에 복사하기 (반복문 사용)

 

double[] origin = new double[] {163.5, 177.2, 180.2};

double[] copy = new double[origin.length]; // 복사본 배열 선언 및 할당

for(int i=0; i<origin.length; i++) {

// origin 배열의 i번째 위치의 데이터를

// copy 배열의 i번째 위치에 저장

copy[i] = origin[i];

}

 

(3) 복사본 배열 = Arrays.copyOf(원본배열, 복사할 길이);

 

* 2차원 배열 : "배열" 안에 "배열"

"1차원 배열"의 묶음

 

선언 표현식

자료형[][] 배열명;

 

* 할당 표현식

배열명 = new 자료형[행의길이][열의길이];

// 행의 길이 : 1차원 배열의 개수

// 열의 길이 : 각 행에 저장된 1차원 배열의 크기


6월 20일 클래스

 

* 클래스(객체)

 

- 객체지향언어 : "객체"를 "지향"하는 언어로 "객체" 중심으로 프로그램이 실행된다.

- "객체" : 현실 세계에 독립적으로 존재하는 모든 것들을 의미

=> 목적/가치/의미가 있는 것들

=> 유형, 무형, 개념, ...

 

- 구현하고자 하는 프로그램 상의 필요한 객체를 만들기 위해,

"클래스(class)"라는 을 먼저 만들어야 함.

=> 객체들의 속성(정보)들을 담아낼 그릇같은 존재

 

- 추상화 과정 1) 구현하고자 하는 프로그램에서 필요한 객체를 생각하기

2) 그 객체들이 가지는 공통적인 속성, 기능들을 추출하기

3) 추출한 것을 가지고 구현하고자 한 프로그램의 "실질적인 목적"에 맞춰 불필요한 속성, 기능을 제거하기

4) 최종적으로 추려진 속성들을 어떤 자료형과 어떤 변수명으로 사용할 것인지 생각하기

 

 

- 클래스는 "변수부(필드부)"와 "메소드부"와 "생성자부"로 구성되어 있다

* 변수(필드/멤버변수) : 객체의 상태(정보)를 담고 있는 것

=> [접근제한자] [예약어] 자료형 변수명;

 

* 메소드 : 객체의 동작/기능 등의 내용을 담고 있는 것

=> 표현법 : [접근제한자] [예약어] 반환타입 메소드명([매개변수정보]){}

 

* 생성자 : 객체를 생성할 때 사용되는 것

=> 표현법 ( 접근제한자 생성자명 매개변수정보 )

접근제한자 생성자명([매개변수정보]) { }

 

-> 생성자명은 클래스명과 동일해야 함

-> 생성자를 정의하는 순간, 기본 생성자가 자동으로 만들어지지 않는다.

 

 - 접근 제한자 : 접근할 수 있는 범위를 제한하는 것

public > protected > default > private

 

- public : 어디서든 접근 가능

- protected : 같은 패키지 이거나, 상속 관계일 때 접근 가능

- default : 같은 패키지 내에 있을 때 접근 가능

- private : 클래스 내에서만 접근 가능

 

- 변수의 스코프

1) 전역변수

* 멤버변수 == 인스턴스변수 == 필드

생성시점 : new 연산자(예약어)를 통하여 객체 생성 시

소멸시점 : 객체 소멸 시 같이 소멸

 

* 클래스변수 == static 변수

생성시점 : 프로그램 실행과 동시에 무조건 메모리 영역(static)에 할당

소멸시점 : 프로그램 종료 시 소멸

 

* 지역변수

생성시점 : 지역변수가 속한 특정 구역({}) 실행 시 메모리영역에 할당

소멸시점 : 특정 구역({}) 종료 시 소멸

 

- 정보 은닉 : 데이터에 "직접" 접근하지 못하도록 하는 것 ( private 접근제한자 사용 )

캡슐화를 통해 데이터에 "간접" 접근하여 사용할 수 있도록 관리함

(setter / getter 메소드 : public 접근제한자 사용 )

 

* setter : 데이터에 어떤 값을 저장하는 기능을 수행하는 메소드

* getter : 데이터의 값을 조회하는 기능을 수행하는 메소드

 

- 오버로딩 : 한 클래스 내에 "같은" 메소드명으로 여러 개를 정의하는 것

* 성립 조건

1) 메소드명이 같아야 한다.

2) 매개변수 정보가 달라야 한다.

 

기준 public void method1(int i){}

1 public void method1(String str){} ( O ) -> 매개변수 개수는 같으나, 타입이 다르기 때문

2 public void method1(int i, String str){} ( O ) -> 매개변수 개수가 다르다.

3 public void method1(int num){} ( X ) -> [기준] 메소드와 매개변수 개수와 타입이 같다.

4 public char method1(int point){} ( X ) -> [기준], [3] 메소드 매개변수 개수와 타입이 같다.

5 public void method1(int i, int k){} ( O ) -> 매개변수 개수와 타입이 다르다.

6 public void method1(int num, String string){} ( X ) -> [2] 메소드와 매개변수 개수와 타입이 같다.

7 public void method1(String str, int i){} ( O ) -> 매개변수 타입의 순서가 다르다.