자바 강의 듣고 정리

     

     

    접근제어지시자 

    • 접근제어지시자를 활용해 변수와 메서드의 공개 범위를 설정할 수 있다. 공개범위가 설정에 따라 '정보은닉'을 구현할 수 있다.
    • 정보은닉이 필요한 이유는 멤버 변수가 외부에서 쉽게 접근할 경우, 이상한 값이 들어올 수 있다. 이 때, 이를 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()

    댓글

    Designed by JB FACTORY