클래스
객체를 나타내는 설계도에 해당함
인스턴스
클래스를 기반으로 메모리내에 실체화 시킨것
<클래스 기본 문법>
[접근제한자] class 클래스명{
멤버 변수
메서드
}
<인스턴스 기본 문법>
Heap 공간에 인스턴스를 생성하여, 생성된 인스턴스의 주소값을 참조형 변수에 저장하여
참조변수를 통해 인스턴스에 접근하도록함
클래스명 참조변수 = new 클래스명();
메서드
작업의 최소 단위(= 작업을 실행하는 코드들의 모음)
반드시 호출되어야만 사용할수 있음
호출하는 메서드 Caller, 호출 당하는 메서드 Worker
메서드가 호출되면 작업을 수행한 후에 반드시 호출한 위치로 돌아감
메서드 작업 수행 후 돌아갈 때 가지고 가는 값을 리턴값이라고 함
메서드 호출 시 전달하는 값을 Parameter 라고 하며
파라미터는 없을 수도 있고, 여러개 일 수도 있다.
main() 메서드는 자바에서 유일하게 프로그램 실행 시 자동으로 호출되는 메서드
메서드 오버로딩(Method Overloading) = 메서드 다중 정의
동일한 이름의 파라미터가 다른 메서드를 여러번 정의 하는것
동일한 기능을 수행하지만, 전달받는 파라미터가 달라야 할 경우
메서드 이름을 각각 따로 지정해야 하지만,
오버로딩을 사용하여 정의하면 메서드 이름을 동일하게 정의하고 파라미터만으로 각각의 메서드를 구별할 수 있다
파라미터를 제외한 나머지는 동일하게 정의함 (접근제한자 클래스명 리턴값 )
<메서드 오버로딩 규칙(택1)>
1. 메서드 파라미터의 타입이 달라야함
2. 메서드 파라미터의 갯수가 달라야함
Variable arguments(VARARGS) = 가변인자 = 비정형 인자
메서드 파라미터의 인자가 변하는 형태(갯수의 제한이 없는 인자)
메서드 선언부의 파라미터 부분에 변수 선언 시 가변인자 기호(...)을 사용하여 표현
=> 파라미터의 데이터 타입 뒤에 ... 기호를 붙임
가변인자를 사용하여 메서드를 정의하면 메서드 호출 시 파라미터 갯수에 제한이 없어짐
=> 단, 같은 타입의 인자만 전달 가능
전달받은 데이터는 변수명에 해당하는 1차원 배열로 자동으로 생성됨
주의! 가변인자는 마지막 파라미터로 단 한번만 지정 가능
Pass by value(값에 의한 전달)
메서드 호출 시 값(실제 데이터)을 복사해서 전달 = 기본형 전달
호출된 메서드 내에서 전달받은 값을 변경해도 원래 데이터에는 영향이 없음
Pass by reference(참조에 의한 전달)
메서드 호출 시 참조값(주소)를 복사해서 전달 = 참조형 전달
호출된 메서드 내에서 전달받은 주소값에 접근하여 값을 변경하면 같은 주소를 참조하는 대상은 동일한 영향을 받는다
생성자(Constructor)
Alt + Shift+ S / O 생성자 자동 생성 단축키
클래스를 사용하여 인스턴스를 생성할 때 호출되는 메서드 형태
주로 인스턴수 변수를 초기화하는 용도 또는 인스턴스 생성 시 초기에 수행할 작업 기술
기본생성자(Default 생성자)
메서드와 생성자 차이점
선언부에 리턴 타입이 없음 ( 리턴값이 없는게 아니라 리턴타입을 기술 하지 않음)
생성자 이름이 클래스명과 동일함
개발자가 생성자를 하나도 정의 하지 않을 경우 컴파일러에 의 해 자동으로 기본생성자 생성
단, 생성자를 하나라도 정의할 경우 기본 생성자는 자동 생성되지 않는다
파라미터가 없는 생성자와 파라미터가 있는 생성자 모두 정의 가능 (=메서드와동일)
일반 메서드 오버로딩과 생성자 오버로딩은 동일
단, 생성자 내에서 다른 생성자를 이름으로 호출할 수 없다
레퍼런스 this(참조형 변수 this)
인스턴스 생성 시 생성된 인스턴스 주소가 자동으로 저장되는 레퍼런스 변수(키워드)
단, 개발자가 선언하는 것이 아닌 자바에 의해 자동으로 선언된 레퍼런스
생성자나 메서드 등에서 로컬 변수를 선언 했을 때, 로컬변수의 이름과 인스턴스 변수가 같은결우 인스턴스 변수를 지정하기 위한 용도로 사용
this.인스턴스 변수명
생성자 this()
생성자 내에서 오버로딩 된 다른 생성자를 호출
생성자 오버로딩 시 중복 코드를 제거하기 위해 사용
생성자 이름대신 this 를 사용하여 생성자 호출 형태를 갖춤
필요한 파라미터를 전달하면 됨
주의! 생성자 this() 는 생성자 내에서 첫번째로 실행되어야 하며, 단 한번만 사용 가능
static 키워드
변수와 메서드에 사용 가능
인스턴스 생성 전, 클래스가 메모리에 로딩되는 시점에 함께 로딩됨
인스턴스 생성과 무관하며, 모든 인스턴스에서 하나의 메모리를 공유함
인스턴스 주소를 갖는 참조 변수 대신 클래스명만으로 접근 가능
static 변수 (=클래스 변수 = 정적변수)
변수의 데이터타입 앞에 static 키워드 사용
인스턴스 생성 없이 클래스가 메모리에 로딩될 때 변수도 함께 로딩됨
클래스명만으로 접근 가능하며, 모든 인스턴스에서 하나의 변수를 공유함
static 메서드 (=정적 메서드 = 클래스메서드)
static 변수와 마찬가지로 클래스가 메모리에 로딩될 때 함께 로딩됨
(인스턴스 생성 전에 로딩됨)
인스턴스 생성없이 클래스명 만으로 호출 가능
static 메서드 내에서는 인스턴스 변수 사용 불가
=>인스턴스 변수가 메모리에 생성되기 전에 static 메서드가 로딩되기 때문
static 메서드 내에서 레퍼런스 this 사용불가
=>레퍼런스 this도 인스턴스 생성 시점에서 메모리에 로딩되기 때문
=> 만약, 로컬변수와 static 변수명이 같을경우
static 변수를 구별하기 위해 클래스명.static변수명 형태로 지정
< 자바 프로그램 실행 과정 및 변수 생성 시점>
- 소스코드 (.java) 작성 후 실행
- 클래스 파일(.class) 생성
- 클래스 파일 실행
- 클래스 로딩 -> static 키워드 사용된 변수 및 메서드 로딩됨
- main() 메서드 호출(실행)
- 인스턴스 생성 -> 인스턴스 변수 및 메서드 롣이됨
- 메서드 호출 -> 로컬 변수 로딩됨
- 메서드 종료 -> 로컬 변수 제거됨
- 인스턴스 제거됨 -> 인스턴스 변수 제거됨
- 프로그램 종료됨 -> static 변수 제거됨
Singleton Design Pattern
유일한 인스턴스 하나만 생성해서 공유하는 프로그래밍 작성 패턴
직접 코드 쳐보기
상속(Inheritance)
Is-a 관계
슈퍼클래스의 멤버(변수 및 메서드) 를 서브클래스에서 물려받아 선언없이 사용하는 것
코드 중복 제거가 가능하며, 유지보수성이 향상됨
상속을 적용하기 위해서는 서브클래스 정의 시 서브클래스명 뒤에 extends 키워드를 사용하여 슈퍼클래스의 이름을 지정해야함
상속에서의 생성자
생성자는 상속되지 않는다
생성자의 이름은 클래스이름을 사용하므로 상속받은 생성자는 부모클래스의 이름이 되어 생성자 규칙에 위배됨
서브클래스의 인스턴스를 생성할 때에는,
자동으로 슈퍼클래스의 인스턴스를 먼저 생성한 후 서브클래스의 인스턴스가 생성됨
서브클래스의 인스턴스 생성 시점에서 생성자를 호출하게 되면 슈퍼클래스의 인스턴스를 생성하기 위해 자동으로 슈퍼클래스의 생성자를 호출하게 됨
메서드 오버라이딩 (Method Overrideing) = 메서드 재정의
슈퍼클래스로부터 상속받은 메서드를 서브클래스에서 새롭게 재정의 하는 것(덮어씀)
기존 슈퍼클래스의 메서드와 동일하게 생긴 메서드를 정의하게 되므로
서브클래스에서는 더 이상 슈퍼클래스의 메서드가 보이지 않고
자신이 오버라이딩한 메서드만 보이게 됨(즉, 슈퍼클래스의 메서드는 은닉됨)
슈퍼클래스의 메서드에 기능을 추가하는 등 메서드 내용 변경이 필요할 때 사용
<오버라이딩 규칙>
- 상속 관계 필수
- 메서드 시그니쳐(메서드명,리턴타입,파라미터)가 일치해야함
- 리턴타입은 상속관계에 있는 서브클래스 타입으로 변경은 가능함
- 접근 제한자는 같거나 넓은 범위로만 변경 가능
- 예외 클래스의 범위는 좁은 범위로만 변경 가능함
- static, final, private 제한자가 지정된 메서드는 오버라이딩 불가 (상수)
접근 제한자 (Access Modifier)
특정 멤버에 대한 접근 범위를 제한하는 키워드
클래스, 메서드, 변수에 사용 가능
주의! 상속관계에 있더라도 인스턴스를 생성하여 접근하게되면
상속관계의 접근이 아닌 일반 클래스 관계 취급됨(protected)
접근제한자 | 같은클래스 | 다른패키지 | 다른패키지 상속관계 |
전체 |
public | O | O | O | O |
protected | O | O | O | X |
default(package) | O | O | X | X |
private | O | X | X | X |
Getter/Setter 메서드
클래스 내에서 private 접근제한자로 선언된 인스턴스 변수 등에 접근하기 위해
클래스 내에서 제공하는 중개 역할의 메서드
Getter : getXXX() 형식의 이름을 사용 하며 파라미터는 없고, 리턴값만 잇는 메서드 형태로 정의
Setter : setXXX() 형식의 이름을 사용 하며 파라미터는 있고, 리턴값은 없는 메서드 형태로 정의
레퍼런스 super
슈퍼클래스의 멤버에 접근하기 위한 키워드(=레퍼런스 변수)
레퍼런스 this 와 동일하나 슈퍼클래스 인스턴스 주소가 저장되어 있는 점이 다르다.
=레퍼런스 this는 자신의 인스턴스 주소가 저장되어 있음
주로 오버라이딩에 의해 은닉된 변수 또는 메서드에 접근해야할 경우 사용
현재 호출된 곳을 기준으로 가장 가까운 곳부터 점차 탐색 범위를 넓혀 가면서 탐색
(ex. 로컬변수 -> 멤버변수 -> 슈퍼클래스의 멤버변수 ) 최종적으로Object 클래스까지 거슬러 올라가면서 탐색하여 없을 경우 오류 발생!
생성자 super()
슈퍼클래스의 생성자를 명시적으로 호출
목적 1) 슈퍼클래스의 생성자 중 특정 생성자를 명시적으로 호출해야하는 경우 사용
ex) 슈퍼클래스에 기본생성자 없이 파라미터 생성자만 정의할 경우
서브클래스에서 슈퍼클래스의 기본생성자를 호출하지 못해 오류 발생
이때, 슈퍼클래스의 파라미터 생성자를 명시적으로 호출할 때 사용
목적 2) 슈퍼클래스의 생성자에서 초기화하는 코드가 존재할 경우
ex) 서브클래스의 생성자에서 슈퍼클래스의 멤버변수까지 초기화하면 코드 중복 발생
이 때, 슈퍼클래스의 멤버는 슈퍼클래스의 생성자에서,
서브클래스의 멤버는 서브클래스의 생성자에서 초기화하여 중복을 제거하기 위해 사용
주의! 생성자 super()는 반드시 생성자내에서 첫번째 문장으로 실행되어야 한다
-> 생성자 this 와 super 를 동시에 사용 불가
1 ) 생성자 호출
2 ) 생성자 this 로 파라미터 값을 3으로 전달
3 ) 파라미터값을 슈퍼클래스 생성자에 전달
4 ) 전달받은 파라미터값을 초기화
5 ) 19line 으로가 서브클래스의 인스턴스 변수 초기화
'Language > Java 요약' 카테고리의 다른 글
6/28 요약 List ~String 관련 클래스 (0) | 2020.06.28 |
---|---|
Java 0614 정리 / 다형성-추상 (0) | 2020.06.14 |
0613 Java 정리 2 / 배열 (0) | 2020.06.13 |
0613 Java 정리 / 변수~ 반복문 (0) | 2020.06.13 |
0527 Java Test (0) | 2020.05.27 |