자바 강의 듣고 정리
- 프로그래밍 언어/JAVA
- 2021. 10. 19.
접근제어지시자
- 접근제어지시자를 활용해 변수와 메서드의 공개 범위를 설정할 수 있다. 공개범위가 설정에 따라 '정보은닉'을 구현할 수 있다.
- 정보은닉이 필요한 이유는 멤버 변수가 외부에서 쉽게 접근할 경우, 이상한 값이 들어올 수 있다. 이 때, 이를 Private로 선언하고, set 함수로만 접근 가능하게 만든 다음, 조건문으로 정상적인 값이 확인될 경우에만 값을 설정할 수 있게 한다.
- private로 변수를 선언할 경우, get,set 메서드를 구현해서 외부에서 값을 변경할 수 있도록 한다.
접근 제어 지시자 | 공개 범위 |
default | 같은 패키지 내부에서만 접근 가능함. 다른 패키지에서 접근하려면, Import로 접근해야함. |
Public | 클래스의 외부 어디에서나 접근 가능(공용) |
Private | 클래스 내부에서만 접근 가능. 상속받은 클래스도 상위 클래스 Private에는 접근 불가능. |
Protected | 같은 패키지 + 상속 관계 클래스에서만 법근 가능. |
Static 변수
- 여러 인스턴스에서 공통으로 사용하는 변수를 선언하고자 할 때, static 변수로 선언한다.
- static 변수는 Class 영역에 선언한다. 모든 인스턴스가 함께 쓰기 때문에 일반적으로는 Private으로 선언해서 외부에서 건드릴 수 없게 한다.
- static 변수는 인스턴스 생성과 상관없이 프로그램 시작과 동시에 데이터 영역에 Constant, Literal과 함께 선언된다. 이런 이유 때문에 인스턴스 명으로 접근해도 되지만, 주로 클래스명으로 접근한다.
- static 변수는 프로그램 시작부터 끝까지 메모리의 데이터 영역을 차지하고 있기 때문에 너무 큰 변수를 선언해둘 경우 메모리 낭비가 심하다.
Static 메서드
- Static 메서드 역시 Static이기 때문에 인스턴스의 선언과 상관없이 사용할 수 있다. 따라서, 클래스명으로 접근한다.
- Static 메서드는 인스턴스의 선언과 상관없이 사용할 수 있는 메서드이기 때문에 메서드 내부에는 멤버변수를 사용하지 않고, Static 변수를 사용한다.
Singleton 패턴 : Static 변수, 메서드를 활용한 디자인 패턴
- 싱글톤 패턴은 프로그램에서 인스턴스가 단 하나만 생성되어야 할 때 사용하는 디자인 패턴이다.
- 싱글톤 패턴은 클래스 내부에서 인스턴스 변수를 하나 선언하고, 그 변수를 메인함수에서 사용할 수 있도록 하는 디자인 패턴이다.
- 싱글톤 패턴은 인스턴스 내부에서 Static 변수, Static 메서드를 선언해서 구현한다.
public class CarFactory{
// 싱글톤 패턴은 클래스 내부에서 하나의 인스턴스만 선언한다.
// 선언된 인스턴스를 메인함수에서 사용할 수 있게 한다.
private static CarFactory carfactory = new CarFactory();
private static int carNum = 10000;
public static CarFactory getInstance(){
return carfactory
}
public static carCreate(){
// 차 인스턴스 만들고, 번호를 부여해준다.
carNUm ++ 1;
public Car car = new Car();
car.setCarNum(carNum);
return car;
}
}
public class Car{
int carNum ;
public int getCarNum(){
return carNum;
}
public int setCarNum(int carNum){
this.carNum = carNum;
}
}
모든
변수의 유효 범위와 메모리
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성 / 소멸 |
지역 변수 | 함수 내부 | 함수 내부 | 스택 | 함수 시작 시 생성 함수 종료 시 소멸 |
멤버 변수 | 클래스 내부 | 클래스 내부 사용. Private이 아니면, 참조변수로 다른 클래스에서 사용 가능 | Heap 영역 | 인스턴스 생성 시 생성 Garbage Collector가 메모리 수거할 때 소멸 |
static 변수 | static을 붙여서 클래스 내부에서 선언 | 클래스 내부 사용. Private이 아니면, 클래스명으로 다른 클래스에서 사용 가능 | 데이터 영역 | 프로그램 시작 시 생성 프로그램 종료 시 소멸 |
자바 1차원 배열
- 인덱스 연산자 [ ]을 이용해 빠른 참조 가능. 배열 자료형의 크기는 4,8바이트로 정해져 있기 때문에 인덱스로 접근 시, 4,8바이트에 인덱스만큼 곱해서 이동하면 된다. 따라서 시간복잡도는 O(1)이 나옴.
- 물리적 위치와 논리적 위치가 동일. 논리적으로 a, a+1이 인접해있다면, 메모리에서도 인접해있음.
- 배열의 순서는 0부터 시작함.
- 배열은 배열의 길이만큼 항상 요소가 다 들어가있지 않기 때문에 Length 메서드를 쓰는 것보다는, 직접 count를 세고 그 값까지 진행하는게 좋다.
배열 선언하기
// int형의 2칸짜리 배열 선언. 안의 요소는 0으로 Default값이 들어가있음.
int[] arr = new arr[2];
// 선언 + 초기화
int[] arr = new arr[]{1,2};
// 선언 // 초기화 따로
// 먼저 참조변수를 선언해줌.
// 참조변수 선언 후, 참조변수 값에 arr 인스턴스 선언하며 값까지 넣어줌.
int[] arr;
arr = new arr[]{1,2}
// 배열 + enhanced For
// arr의 각 인덱스에 있는 값이 저장된 타입을 앞에 적고 변수명을 붙여준다.
// for문의 처음부터 끝까지 돌면서, 값을 하나씩 출력해준다.
for (int num : arr){
System.out.println(num)
}
자바 2차원 배열
- 1차원 배열을 두번 선언하는 형식으로 선언이 가능하다.
- 사람이 이해하는 방식으로는 행,열로 되어있으나 메모리에는 일렬로 인접하게 저장되어있음.
// 변수형, 참조변수명, 생성자, 변수형
// 3행 4열의 행렬이 선언됨
int[][] arr = new int[3][4];
// 3행 4열의 행렬 선언 + 초기화까지 진행
int[][] arr = new int[][]{{1,2,3,4},{1,2,3,4},{1,2,3,4}};
// 2차원 배열의 값들 출력하기
// 가장 바깥쪽은 행에 대한 배열. 따라서, 이 배열의 길이는 3개다.
// 안쪽은 열에 대한 배열. 행의 값으로 접근하면 됨.
for (int i = 0 ; i < arr.length ; i ++){
for (int j = 0; j < arr[i].length ; j++){
System.out.println(arr[i][j])
}
}
배열의 얕은 복사, 깊은 복사
- 배열의 복사에는 얕은 복사와 깊은 복사가 있다. 얕은 복사는 A라는 배열이 가리키고 있는 주소값을 B라는 배열에게 복사해준다. 즉, 같은 주소값을 가리키고 있기 때문에 A 또는 B배열에서 그 주소값의 데이터를 변경하면, A와 B 모두가 영향을 받는다. 배열의 얕은 복사는 System.arrayCopy() 메서드로 가능하다.
- 배열의 깊은 복사는 주소값을 복사하는 게 아닌 배열에 저장되어있는 값을 복사해주는 것이다. 이 경우는 복사받을 배열에 객체를 선언해두고, 객체에 값을 복사해서 해결할 수 있다.
얕은 복사 코드
// 복사할 배열, 복사할 배열의 시작 위치, 붙일 배열, 붙일 배열의 붙일 시작 위치, 복사할 총 길이
System.arraycopy(originArray, 0, copyArray, 0, 4);
깊은 복사 코드
for(int i = 0 ; i < originArray.length ; i++){
copyArray[i].author = originArray[i].author;
copyArray[i].title = originArray[i].title;
}
객체 배열을 이용한 Array List
배열의 자료형에 객체를 넣을 수 있다. 이를 객체 배열이라고 한다. 주로 클래스에서 반복적으로 추가되거나 삽입되는 데이터들을 관리할 때 사용한다.
import Book;
import java.util.ArrayList;
// 자료형 // 참조변수 이름 // 생성자 // 자료형
// 앞에 기입된 자료형을 기준으로 뒷쪽 <>에 채워진다. 내가 채워넣어도 괜찮다.
// 생성자기 때문에 ()로 끝난다.
ArrayList<Book> arr = new ArrayList<>();
ArrayList<Book> arr = new ArrayList<Book>();
// 참조변수 선언 후, 초기화도 가능하다.
ArrayList<Book> arr ;
arr = new ArrayList<>();
객체 배열은 ArrayList라는 내부 구현 클래스를 활용해서 인스턴스를 만드는 것이고, 이에 대해서 만들어진 메서드들이 있다. 아래 메서드들을 활용하여 ArrayList 클래스를 활용한다. 앞쪽에 있는 Type은 메서드 실행 후 Return되는 타입을 표기한 것이고, E는 Element를 이야기 한다.
- boolean add()
- int size()
- E get()
- E remove()
- boolean isEmpty()
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
자바의 Object Class (0) | 2021.10.23 |
---|---|
Java의 여러 내부 클래스 정의, 유형 (0) | 2021.10.23 |
Java의 Lambda Expression(람다식) (0) | 2021.10.22 |
Java의 Reduce 정의 (0) | 2021.10.22 |
자바 기초 정리 : 상속, 인터페이스 (0) | 2021.10.21 |