[배열]
* 1차원 배열 : "같은 자료형"의 "여러 개의 데이터"을 저장하는 공간
배열의 데이터는 "인덱스"로 관리가 된다.
** 인덱스의 시작번호: 0 **
* 선언 표현식
자료형[] 변수명;
* 할당 표현식
자료형[] 변수명 = new 자료형[배열길이];
* 배열 선언과 동시에 할당
(1) 자료형[] 참조변수명 = new 자료형[] {값1, 값2, 값3};
자료형[] 참조변수명;
참조변수명 = new 자료형[]{값1, 값2, 값3};
(2) 자료형[] 참조변수명 = {값1, 값2, 값3}; (O)
자료형[] 참조변수명;
참조변수명 = {값1, 값2, 값3}; (X)
(3) 자료형[] 참조변수명 = new 자료형[데이터길이];
참조변수명[0] = 값1;
참조변수명[1] = 값2;
참조변수명[n] = 값n;
* 배열 복사
(1) 얕은 복사 : 주소 값만 복사하여 실제 데이터는 한 곳에서 관리.
데이터가 변경되면 복사된 배열에도 영향을 줌(반영이 됨)
ex) int[] arr1 = new int[] {1, 2, 3};
int[] arr2 = arr1;
(2) 깊은 복사 : 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사.
(1) 반복문 사용
ex) 아래 origin 배열을 copy 라는 배열에 깊은 복사하기 (반복문 사용)
double[] origin = new double[] {163.5, 170.2, 180.7};
double[] copy = new double[origin.length]; // 복사본 배열 선언 및 할당
for(int i=0; i<origin.length; i++) {
// origin 배열의 i번째 위치의 데이터를
// copy 배열의 i번째 위치에 저장
copy[i] = origin[i];
}
// copy 배열의 값을 모두 출력해보자.
for (자료형 변수명 : 배열명) {
// 배열의 첫번째 위치부터 마지막 위치까지 순서대로 접근
// 변수명을 통해 접근 가능!
// (자료형을 배열의 자료형과 일치해야함)
}
for (double item : copy) {
System.out.println(item);
}
(2) 복사본 배열 = 원본배열.clone();
(3) 복사본 배열 = Arrays.copyOf(원본 배열, 복사할 길이);
(4) System.arraycopy(원본배열명, 복사시작할인덱스, 복사본배열명, 복사본배열의 복사될 시작인덱스,
* 2차원 배열 : "배열" 안에 "배열"
"1차원 배열" 의 묶음
인덱스가 2개 필요!
* 선언 표현식
자료형[][] 변수명;
* 할당 표현식
변수명 = new 자료형[행의크기][열의크기];
* 행의 크기 : 1차원 배열의 총 개수
* 열의 크기 : 해당 위치의 1차원 배열의 길이
* 2차원 배열 초기화
자료형[][] 변수명 = {
new 자료형[],
{값1, 값2, 값3}
};
-> 서로 다른 길이의 1차원 배열을 할당할 수 있는가? 가능
자료형[][] 변수명 = new 자료형[행의길이][];
변수명[0] = new 자료형[5];
변수명[1] = new 자료형[3];
* 클래스(객체)
- 객체지향언어 : "객체" 를 "지향"하는 언어로 "객체" 중심으로 프로그램이 실행된다.
- "객체" : 현실 세계에 독립적으로 존재하는 모든 것들을 의미
=> 목적/가치/의미가 있는 것들
=> 유형, 무형, 개념, ...
- 구현하고자 하는 프로그램 상의 필요한 객체를 만들기 위해,
"클래스"라는 틀을 먼저 만들어야 함.
=> 객체들의 속성(정보)들을 담아낼 그릇같은 존재
- 추상화 과정
1) 구현하고자 하는 프로그램에서 필요한 객체를 생각하기
2) 그 객체들이 가지는 공통적인 속성, 기능들을 추출하기
3) 추출한 것을 가지고 구현하고자 한 프로그램의 "실질적인 목적"에 맞춰 불필요한 속성, 기능을 제거하기
4) 최종적으로 추려진 속성들을 어떤 자료형과 어떤 변수명으로 사용할 것인지 생각하기
- 클래스는 "변수"와 "생성자"와 "메소드"로 구성되어 있다.
* 변수부 (필드/멤버변수) : 객체의 상태(정보)를 담고 있는 것
=> 표현법
[접근제한자] [예약어] 자료형 변수명[ = 값];
* 메소드부 : 객체의 동작/기능 등의 내용을 담고 있는 것
=> 표현법
[접근제한자] [예약어] 반환타입 메소드명([매개변수정보]) {
// 어떤 기능을 수행할 코드 : 제어문, 다른 메소드 호출, .. 변수선언, ...
}
* 생성자 : 객체를 생성할 때 사용되는 것
-> 기본생성자 : 매개변수가 없는 상태
public 클래스명() {}
=> 표현법
접근제한자 클래스명([매개변수정보]) {
// 매개변수가 있을 경우 보통은 해당 변수에 초기화 작업을 수행
}
- 접근 제한자 : 접근할 수 있는 범위를 제한하는 것
=> 넓은 범위 순서로 나열해본다면..? public > protected > default > private
* public : 어디서든 접근 가능
* protected : 같은 패키지 내 또는 상속 관계
* default : 같은 패키지
* private : 클래스 내에서만 접근 가능
- 변수의 스코프
1) 전역변수
* 멤버변수 == 인스턴스변수 == 필드
생성시점 : "new" 연산자를 통하여 객체 생성 시
소멸시점 : 객체 소멸 시 같이 소멸
* 클래스변수 == static 변수
생성시점 : "프로그램 실행"과 동시에 무조건 메모리 영역(static)에 할당
소멸시점 : 프로그램 종료 시 소멸
* 지역변수
생성시점 : 지역변수가 속한 특정 구역({}) 실행 시 메모리영역에 할당
소멸시점 : 특정 구역({}) 종료 시 소멸
- 정보 은닉 : 데이터에 "직접"접근하지 못하도록 하는 것 ( private 접근제한자 사용 )
캡슐화를 통해 데이터에 "간접" 접근하여 사용할 수 있도록 관리함
(setter / getter 메소드 : public 접근제한자 사용 )
* setter : 데이터에 어떤 값을 저장하는 기능을 수행하는 메소드 ( 반환타입 : void )
* getter : 데이터의 값을 조회하는 기능을 수행하는 메소드 ( 반환타입 : 해당 변수의 자료형 )
- 오버로딩 : 한 클래스 내에 "같은" 메소드명으로 여러 개를 정의하는 것
* 성립 조건
1) 같은 메소드명
2) 매개 변수 개수/타입/순서 가 달라야 함
- 객체 배열 : "객체"를 저장하는 배열
* 선언 표현식
클래스명[] 변수명;
* 할당 표현식
변수명 = new 클래스명[배열길이];
* 선언과 동시에 할당 ( 배열을 할당 )
클래스명[] 변수명 = new 클래스명[배열길이];
.. 변수명[0] = new 클래스명();
System.out.println(변수명[0]); // --> (1) 0x123 (2) null (3) name값과 price값
// 아래 데이터가 저장된 메모리 구조를 그림판으로 그려보기
-----------------------------------------
int n1 = 30;
int[] numbers = {100, 200, 300};
System.out.println(numbers); // 출력 결과 : 0x123
Student s1 = new Student("홍길동", 40);
System.out.println(s1); // 출력 결과 : 0x201
Student[] sArr = new Student[3];
sArr[0] = new Student();
System.out.println(sArr); // 출력 결과 : 0x400
'자바' 카테고리의 다른 글
자바 정리 3 (0) | 2024.07.10 |
---|---|
java 복습 정리 (0) | 2024.07.10 |
java 과제 (0) | 2024.06.23 |