[Java] 클래스와 객체 개념 복습
기초적인 자바 학습이 끝났다.
그동안의 학습성취도를 평가하기 위해 학습진도표를 문제삼아 다시한번 개념정리를 하는 주간을 갖기로 했다.
반복문까지 파트는 건너뛰고, 난이도가 높아진 클래스와 객체 파트부터 차근차근 배운 내용을 정리하고
2주간 학습점검을 하기로 했다. 오늘 작성한 부분에서 막힌 개념은 포스팅 하단부분에 다시 작성하는 방식으로 한다.
사용자 정의의 자료형을 이해할 수 있다.
클래스는 서로 다른 자료형의 데이터를 사용자(개발자) 정의로 하나로 묶어 새로운 타입을 정의할 수 있다.
배열과 달리 다른 자료형들의 값을 하나로 묶을 수 있다.
클래스와 인스턴스의 차이를 이해하고 설명할 수 있다.
클래스는 객체를 만들어 내기 위한 설계도 혹은 틀이며
객체는 소프트웨어 세계에서 구현하는 대상이며, 클래스의 타입으로 선언되었을때 객체라고 한다.
인스턴스란 객체가 실제로 메모리에 할당되어 사용될 때 인스턴스라고 한다.
사용자 정의의 자료형을 작성하고 활용할 수 있다.
클래스를 만들고 그 안에 속성을 담당하는 멤버변수 = 필드 부분을 작성 / 행위(기능)을 담당하는 메소드를 작성
클래스의 인스턴스화는 클래스명 변수명 = new 클래스명() ; 처럼 작성하여 객체를 만들 수 있다.
캡슐화를 적용하지 않는 경우 문제점이 무엇인지 이해할 수 있다.
필드에 직접 접근할 시 올바르지 않은 값이 들어가는 것을 막을 수 없고,
필드명이 변경되면 관련된 코드를 수정해야 하는 번거로움이 있다.
이를 캡슐화를 통해 간접 접근 하도록 하는 것.
접근 제한자에 대해 이해할 수 있다.
클래스나 클래스의 멤버에 참조연산자로 접근할 수 있는 범위를 제한하는 키워드 이다.
캡슐화의 목적을 설명할 수 있다.
캡슐화는 정보은닉으로 클래스에 만들어둔 필드에 접근제한자를 두어 직접 접근하지 못하고, 간접접근 하도록
public으로 접근을 허용한 메소드만 이용 가능하게 해놓은 것이다. 유지보수성 증가를 위한 기술.
캡슐화를 적용하여 클래스를 작성할 수 있다.
private 자료형 변수명 ;
추상화를 이해하고 설명할 수 있다.
프로그램에서 필요한 속성만을 추출하고, 불필요한 공통점을 제거하는 과정을 추상화 라고 한다.
객체를 추상화하여 클래스를 작성하고 이를 활용할 수 있다.
학생은 이름과 반이라는 속성을 가진다.
public class Student {
private String name ;
private int classRoom ;
}
생성자에 대해 이해할 수 있다.
객체가 new 연산자를 통해 Heap메모리 영역에 할당될 때 1회성으로 호출되는 리턴타입이 없는 메소드
인스턴스 생성시 필드 초기화 목적으로 주로 사용된다.
생성자의 사용 목적에 대해 이해할 수 있다.
인스턴스 생성 시점에서 수행할 명령문이 있는 경우 사용한다,
매개변수로 전달받은 값으로 필드를 초기화하여 인스턴스를 생성할 목적으로 주로 사용된다.
작성한 생성자로만 인스턴스를 생성할 수 있도록 제한하는 용도로 사용할 수 있다.
생성자의 작성 문법을 숙지하여 생성자를 작성할 수 있다.
생성자 선언은 메소드 선언과 유사하지만 반환값이 없다. 생성자명은 클래스명과 동일해야 한다.
접근제한자 클래스명(매개변수){
this.필드명 = 매개변수;
}
기본생성자와 매개변수 있는 생성자에 대해 이해할 수 있다.
/* 기본 생성자 */
Student student1 = new student(); //클래스명 레퍼런스변수 = new 생성 () ;
/* 모든 필드를 초기화하는 생성자 */
Student student2 = new student(); //클래스명 레퍼런스변수 = new 생성자(name,2) ;
this.과 this()를 이해할 수 있다.
인스턴스가 생성되었을때 매개변수로 받는 지역변수와 필드에 작성된 전역변수의 이름이 동일할 때
지역변수에 먼저 접근하기 때문에 전역변수에 접근하기 위해서 this. 을 명시해야한다.
this()란 생성자 오버로딩을 할 때 반복되는 소스를 줄여주기 위해
생성자 내부의 코드 블럭 첫줄에 기입하여 자신의 다른 생성자를 호출하는 것이다.
private int score; //클래스의 필드 부분에 추가된 속성
public student(String name, int classRoom, int score) { //학생의 점수가 추가되었다.
this(name, classRoom); //다른 생성자를 호출할 때 사용
this.score = score ;
}
복사 생성자에 대해 이해할 수 있다.
객체를 똑같이 복사해서 사용해야 할 때 얕은 복사가 아닌
새로 복사한 객체가 완전히 분리 되어야 할 때 사용 (깊은 복사)
//인스턴스의 복사를 위한 생성자
public Student(Student student) {
this.name = student.name;
this.classRoom = student.classRoom;
this.score = student.score;
}
Student student3 = new Student(student1); //학생3의 객체생성시 학생 1을 매개변수로 전달
오버로딩이 무엇인지 설명할 수 있다.
오버로딩은 자바의 한 클래스에서 이미 사용하려는 이름과 동일한 메소드가 있더라도
매개변수의 개수나 타입이 다르면 같은 이름을 사용해서 메소드를 정의할 수 있다.
오버로딩의 사용 이유에 대해 이해할 수 있다.
동일한 메소드명으로 사용하기 위해서. 메소드에 사용되는 이름을 절약할 수 있다. 관리가 쉬워짐.
오버로딩의 성립 요건에 대해 설명할 수 있다.
메소드 명은 같고, 매개변수의 타입, 개수, 순서(메소드의 시그니처)가 달라야한다.
리턴값과 접근제한자는 상관이 없다.
다양한 타입의 매개변수를 활용하여 메소드를 작성하고 호출할 수 있다.
public void method (int 변수명);
public void method (int 변수명 , String 변수명);
public void method (int 변수명 , double 변수명);
위 method는 전달받은 값을 이용하여 각기 다른 코드를 실행할 수 있다.
static 키워드에 대해 이해할 수 있다.
static은 프로그램 실행시 생성되는 정적영역 static에 할당되는 키워드.
인스턴스를 생성하지 않아도 클래스의 멤버에 지정할 수 있다. 여러 인스턴스가 공유해서 사용할 목적의 공간이다.
static 필드에 접근하기 위해서는 클래스명.필드명으로 접근한다.
static member와 non static member를 구분하여 접근할 수 있다.
인스턴스 생성 시점에 사용가능한 변수를 non-static 멤버 변수 (==필드 ==전역변수)라고 하고,
프로그램 실행시 정적영역에 할당되는 변수를 static field 클래스 변수(==정적필드) 라고 한다.
private String name;
private static int grade;
필드에서 사용하는 final의 의미를 이해할 수 있다.
상수 필드를 의미한다. 변하지 않는 값으로 선언과 동시에 초기화 혹은 생성자를 통한 초기화를 해주어야 한다.
초기화 이후에는 값을 변경할 수 없다.
public static final double PI = 3.14;
싱글톤 패턴에 대해 이해할 수 있다.
클래스의 인스턴스 사용시 메모리 공간에 있는 하나의 인스턴스 를 공유 해서 사용하는 디자인 패턴
생성 된 하나의 인스턴스만을 사용한다.
싱글톤 패턴의 장단점에 대해 이해할 수 있다.
한 개의 인스턴스 사용으로 고정된 메모리 영역을 사용하기 때문에 메모리 낭비을 방지하고 속도가 빠르다.
데이터 공유가 쉽다. 동시성 문제를 고려해서 설계해야만 한다.
단점은 싱글톤 패턴을 구현하는 코드 자체가 많이 필요하고, 테스트를 하기 어렵다. 유연성이 떨어짐.
이른 초기화와 게으른 초기화를 구분하여 싱글톤 패턴을 구현할 수 있다.
이른 초기화EagerSingleton 는 클래스가 초기화 되는 시점에 인스턴스를 생성한다.
클래스를 로드하는 속도는 느려지지만 처음 인스턴스 반환 요청에서는 속도가 빠르다.
게으른 초기화LazySingleton 는 클래스가 초기화되는 시점에는 정적 필드를 선언해두고 null로 초기화
인스턴스를 생성한 적이 없는 경우 인스턴스를 생성해서 반환하고
생성한 인스턴스가 있는 경우 만들어진 인스턴스를 반환한다.
게으른 초기화를 사용하면 클래스를 로드하는 속도는빠르지만
첫번째 요청에 대한 속도가 두번째 요청에 대한 속도보다 느리다.
변수의 작성 위치 및 static 키워드 유무에 따른 구분을 할 수 있다.
메소드 영역안에 작성하는 것이 지역변수.
메소드 괄호안에 선언하는 변수를 매개변수. 매개변수도 일종의 지역변수이다.
클래스 영역에 작성하는 변수를 필드, 멤버변수, 전역변수 라고 한다.
static 키워드를 사용하면 정적영역에 생성되는 변수로 정적 필드 라고 한다.
non-static 변수는 인스턴스 생성시점에 사용 가능한 인스턴스 변수라고한다.
변수 종류별 특징과 라이프사이클, scope에 대해 이해할 수 있다.
지역변수와 매개변수 모두 메소드 호출시 stack을 할당받아 stack에 생성된다.
지역변수는 해당 블럭 내에서만 사용 가능하고 메소드가 끝나는 시점에 사라진다.
전역 변수는 클래스 내에서 사용 가능하다. 다른 메소드에서도 사용 가능.
초기화 블록에 대해 이해할 수 있다.
초기화를 하지 않으면 jvm이 정한 기본값으로 객체가 생성된다.
인스턴스 초기화 블럭은 필드를 초기화 하는데 이때 static 정적필드를 초기화 할 수 있는 것 처럼 보이지만
인스턴스 생성전에 이미 static 초기화가 진행되었기 때문에 값을 덮어쓰게 되는 것이다.
static 초기화 블럭은 프로그램 실행시 초기화를 실행하기 때문에 인스턴스 변수를 초기화 할 수없다.
정적 초기화 블럭이 동작되는 시점에는 인스턴스가 존재하지 않기 때문이다.
필드의 초기화 순서에 대해 이해할 수 있다.
인스턴스변수
jvm 기본값 -> 명시적초기값 -> 인스턴스 초기화블럭 -> 생성자
클래스 변수
jvm 기본값 -> 명시적초기값 -> 정적 초기화블럭 -> 인스턴스 초기화블럭 -> 생성자
부족했던 부분
1. 싱글톤의 개념. 이른 초기화와 게으른 초기화.
2. 필드 초기화 순서
3. 복사 생성자의 사용법