객체지향 언어
코드의 재사용성이 높다
코드의 관리가 용이하다
신뢰성이 높은 프로그래밍이 가능하다
클래스와 객체
클래스 : 객체를 정의해 놓은 것, 객체의 설계도, 객체를 생성하는데 사용
객체 : 메모리에 생성된 것
객체의 구성요소
객체 : 속성과 기능의 집합
멤버 : 객체가 가지고 있는 속성과 기능
속성 : 멤버변수
기능 : 메서드
객체와 인스턴스
인스턴스 : 클래스로부터 만들어진 객체
인스턴스화 : 클래스로부터 객체를 만드는 과정
한 파일에 여러 클래스 작성하기
소스파일의 이름 = public class 이름
대소문자까지 일치해야 한다.
하나의 소스파일에는 1개의 public class만 존재한다.
public class가 없는 경우 소스파일의 이름은 클래스의 어떤 이름이어도 가능하다.
객체의 생성과 사용
클래스명 변수명; // 클래스의 객체를 참조하기 위한 참조변수 선언
변수명 = new 클래스명(); // 객체 생성 후, 객체의 주소를 참조변수에 저장
클래스명 변수명 = new 클래스명(); // 위 두문장을 한 문장으로 사용가능
인스턴스는 참조변수를 통해서만 다룰 수 있으며,
참조변수의 타입은 인스턴스의 타입과 일치해야 한다.
인스턴스의 속성(멤버변수)은 서로 다른 값을 유지할 수 있다.
메서드의 내용은 모든 인스턴스에 대해 동일하다.
객체배열
객체배열 : 많은 수의 객체를 다뤄야 할 때 사용, 참조변수들을 하나로 묶은 참조변수 배열
객체 배열 생성 : 객체가 저장된 것은 아니다. 객체 생성 후 객체 배열의 각 요소에 저장하는것이 필수
배열의 초기화 블럭 또는 for문을 사용한다.
예) Tv[] tvArr = { new Tv(), new Tv(), new Tv(), .... };
또는
Tv[] tvArr = new Tv[100];
for (int i=0; i < tvArr.length ; i++) {
tvArr[i] = new tv();
}
클래스의 정의
데이터와 함수의 결합
1. 변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체 : 서로 관련된 여러 데이터를 종류에 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스 : 데이터와 함수의 결합 (구조체 + 함수)
클래스 : 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것
사용자 정의 타입
사용자 정의 타입 : 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것
자바에서는 클래스 = 사용자 정의 타입
선언위치에 따른 변수의 종류
변수의 종류 : 클래스 변수, 인스턴스 변수, 지역변수
지역변수 (lv)
- 멤버변수를 제외한 나머지 변수들
- 클래스 영역 이외의 영역에 선언
클래스 변수 (cv)
- 멤버변수 중 static이 붙은 변수
- 클래스 영역에 선언
- 클래스가 메모리에 올라갈 때 생성 (인스턴스 생성 없이 사용 가능)
- 모든 인스턴스가 공통 저장공간 공유
- 한 클래스의 모든 인스턴스들이 공통값을 유지해야하는 속성일 때 선언
- 클래스이름.클래스변수 형식으로 사용
인스턴스 변수 (iv)
- 멤버변수 중 static이 붙지 않은 변수
- 클래스 영역에 선언
- 인스턴스 생성 시 생성
- 인스턴스마다 별도의 저장공간을 가진다. (서로 다른값 저장 가능)
- 인스턴스마다 고유한 상태를 유지해야하는 속성일 때 선언
메서드
메서드(=블랙박스) : 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것 (함수와 유사)
- 선언부 : 반환타입 메서드이름 (타입 변수명, 타입 변수명, ....)
- 구현부 : 메서드 호출시 수행될 코드
메서드의 선언부
메서드의 선언부 : 반환타입 메서드이름(매개변수 선언) 형식으로 구성
매개변수 선언
- 메서드가 작업 수행 시 필요한 값들을 제공받기 위한 것 (입력)
- 필요한 값의 개수만큼 변수 선언 (쉼표로 구분)
- 변수의 타입이 같아도 타입 생략 불가 예) int add(int x, int y) { } 매개변수 x,y의 타입이같아도 x,y 모두에 타입입력필수
- 매개 변수 개수가 많은 경우 → 배열, 참조변수 사용
- 입력할 값이 없다면 → 괄호 안 공백 예) int add( ) { }
반환타입
- 메서드 결과값(출력)의 타입
- 반환값이 없는 경우 → 반환타입 void 예) void print( ) { }
메서드의 구현부
메서드를 호출했을 때 수행될 문장
return문
- 반환값이 있는경우 반드시 구현부 { } 안에 return 반환값; 작성 필수
- 반환값의 타입은 반환타입과 일치하거나 자동 형변환이 가능한 것이어야 한다.
- 단 하나의 값만 반환 가능 (입력은 여러개여도 출력은 최대 하나만 가능)
지역변수
- 메서드 내에 선언된 변수
- 서로 다른 메서드라면 같은 이름의 변수 선언 가능
메서드의 호출
메서드를 호출해야 구현부의 문장들이 수행된다.
인수와 매개변수
인수(인자)
- 메서드 호출 시 괄호 안에 지정해준 값들
- 개수와 순서는 메서드에 선언된 매개변수와 일치해야 한다.
- 타입 : 매개변수의 타입과 일치하거나 자동 형변환 가능한 것이어야 한다.
return문
- 현재 실행중인 메서드 종료 후 호출한 메서드로 되돌아간다.
- 반환값이 있는 경우(반환타입이 void가 아닌경우) 반드시 return문이 있어야 한다.
- if문 사용시 주의! if문만 사용 시 조건식의 결과에 따라 return문이 실행되지 않을 수도 있으므로
- else문을 추가하여 블럭 각각에 return문이 있도록 해야 한다. (항상 결과값 반환)
기본형 매개변수
- 기본형 매개변수 : 변수의 값을 읽기만 할 수 있다. (저장된 값만 복사)
참조형 매개변수
- 참조형 매개변수 : 변수의 값을 읽고 변경할 수 있다. (인스턴스의 주소가 복사)
참조형 반환타입
반환하는 값의 타입이 참조형 → 정수값 반환(참조형 타입의 값은 객체의 주소)
static 메서드와 인스턴스 메서드
클래스 메서드
- 메서드 앞에 static
- 객체 생성 없이 클래스이름.메서드이름(매개변수) 호출가능
- 인스턴스와 관계없는 메서드(인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드)
인스턴스 메서드
- 메서드 앞에 static이 없음
- 반드시 객체 생성해야 호출가능
- 메서드 작업 수행 시 인스턴스 변수가 필요
static을 언제 붙여야 할까?
- 클래스의 멤버변수 중 모든 인스턴스에서 같은 값이 유지되어야 하는 변수
- 작성한 메서드 중에서 인스턴스 변수나 인스턴스 메서드를 사용하지 않는 메서드
메서드 간의 호출과 참조
- 같은 클래스 내의 메서드 → 객체 생성,참조변수 없이 호출가능
- static 메서드 → 인스턴스 메서드 호출불가
- 인스턴스 메서드 → 인스턴스 변수 사용 가능
- static 메서드 → 인스턴스 변수 사용 불가
오버로딩(overloading)
한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것
- 메서드 이름이 같아야 한다
- 매개변수의 개수 또는 타입이 달라야 한다.
- 반환 타입은 관계없다.
생성자(constructor)
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드, 인스턴스변수의 초기화 작업에 주로 사용
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
클래스이름(타입 변수명, 타입 변수명, ...) {
주로 인스턴스 변수의 초기화 코드
}
오버로딩이 가능하다(하나의 클래스에 여러개의 생성자 존재 가능)
* 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
기본 생성자(default constructor)
- 모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다.
- 소스파일(.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 자도으로 기본생성자를 추가하여 컴파일 된다.
- 클래스이름( ) { }
매개변수가 있는 생성자
매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다.
매개변수를 갖는 생성자를 사용하는 것은 코드를 보다 간결하고 직관적으로 만든다.
예) Car c = new Car("white", "auto", 4);
생성자에서 다른 생성자 호출하기 - this()
- 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반ㄷ시 첫 줄에서만 호출이 가능하다.
두가지 조건 만족 시 생성자 간에도 서로 호출이 가능하다.
객체 자신을 가리키는 참조변수 - this
생성자의 매개변수로 인스턴스변수들의 초기값을 제공받는 경우가 많기 때문에 매개변수와 인스턴수변수의 이름이 일치하는 경우가 자주 있다.
이 때 this를 사용해서 구별되도록 하는 것이 명확하고 이해하기 쉽다.
- this : 인스턴스 자신을 가리키는 참조변수. (static메서드에서 사용불가) / 모든 인스턴스메서드에 지역변수로 숨겨진 채 존재한다.
- this(), this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
변수의 초기화
변수를 선언하고 처음으로 값을 저장하는 것
가능하면 선언과 동시에 초기화하는 것이 바람직.
- 멤버변수(클래스 변수와 인스턴스 변수)는 자동적으로 기본값으로 초기화된다.
- 지역변수는 사용하기 전에 반드시 초기화해야 한다.
멤버변수의 초기화
- 클래스 변수(cv) 초기화 → 인스턴스 변수(iv) 초기화 순서
- 자동 초기화 → 명시적 초기화(간단) → 초기화 블럭, 생성자(복잡)
명시적 초기화 : 변수를 선언과 동시에 초기화하는 것
초기화 블럭
클래스 초기화 블럭 :
- 클래스 변수의 초기화에 사용된다.
- 처음 메모리에 로딩될 때 한번만 수행
- static { }
인스턴스 초기화 블럭 :
- 인스턴스변수의 복잡한 초기화에 사용된다.
- 인스턴스가 생성될 때마다 수행
- 클래스 내에 블럭 { }
'JAVA' 카테고리의 다른 글
애너테이션(annotation) (0) | 2022.12.19 |
---|---|
열거형(enum) (0) | 2022.12.19 |
컬렉션 프레임웍(collections framework) (0) | 2022.12.19 |
객체지향프로그래밍(2) - 상속, Object 클래스 (0) | 2022.12.19 |
배열 Array(1) (1) | 2022.12.08 |