클래스와 객체, 인스턴스
클래스 : 객체를 정의해 놓은 것, 객체의 설계도 또는 틀
객체 : 클래스에 정의된 내용대로 메모리에 생성된 것(실제로 존재하는 것)
인스턴스 : 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화 라고 하며, 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스라고 한다.
객체와 인스턴스의 차이점
인스턴스와 객체는 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.
ex) 책상은 인스턴스다라고 하기 보다는 책상은 객체다라는 쪽이, 책상은 책상 클래스의 객체이다라고 하기 보다는 책상은 책상 클래스의 인스턴스다 라는 쪽이 자연스럽다.
객체의 구성
속성 : 멤버 변수, 특성, 필드, 상태
기능 : 메서드, 함수, 행위
객체 지향 언어
객체지향이론의 기본 개념은 실제 세계는 사물로 이루어져 있으며, 발생하는 모든 사건들은 사물간의 상호작용이라는 것이다. 소프트웨어 개발 시에도 부품에 해당하는 객체들을 먼저 만들고, 이것들을 하나씩 조립해서 완성된 프로그램을 만드는 기법을 객체 지향 프로그래밍이라고 한다.
객체 지향 프로그래밍의 특징
1. 캡슐화(Encapsulation)
- 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것
- 외부 객체는 객체 내부 구조를 알지 못하며, 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있음
- 캡슐화 하는 이유 : 외부의 잘못된 사용으로 인해 객체가 손상되는 것을 방지
- 접근 제한자(Access Modifier)를 통해 캡슐화
2. 상속(Inheritance)
- 상위 객체가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 하는 것
- 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와주고, 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문에 반복된 코드의 중복을 줄여준다.
- 상위 객체의 수정으로 모든 하위 객체들의 수정 효과를 가져오므로 유지 보수에 용이하다.
3. 다형성(Polymorphism)
- 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
- 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해줌
- 부모 클래스 또는 인터페이스의 타입 변환을 허용하여 다형성
- 부모 타입에는 모든 자식 객체가 대입될 수 있고 인터페이스 타입에는 모든 구현 객체가 대입 될 수 있음
- 다형성의 효과 -> 객체의 부품화
- ex) 자동차를 설계할 때 타이어 인터페이스 타입을 적용했다면, 이 인터페이스를 구현한 실제 타이어들은 어떤 것이든 상관없이 장착이 가능
인스턴스의 생성과 사용
new 연산자 사용
클래스명 변수명;
변수명 = new 클래스명();
new
- 클래스로부터 객체를 생성시키는 연산자
- new 연산자로 생성된 객체는 heap 영역에 생성됨
- new 연산자는 힙 영역에 객체를 생성시킨 후, 객체의 주소를 리턴
- 리턴한 주소를 참조 타입인 클래스 변수에 저장해두면, 변수를 통해 객체를 사용할 수 있음
new 연산자로 객체를 생성(heap)하고 리턴된 객체의 주소를 변수(stack)에 저장하여 변수가 객체를 참조
변수와 메서드
변수
- 인스턴스 변수 : 클래스의 인스턴스를 생성할 때 만들어진다. 인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다. 인스턴스마다 고유한 상태를 유지해야하는 속성의 경우, 인스턴스변수로 선언한다.
- 클래스 변수 : 선언하는 방법은 인스턴스 변수에 static을 붙이기만 하면 된다. 클래스 변수는 모든 인스턴스가 공통된 변수를 공유하게 된다. 클래스가 메모리에 올라갈 때 생성된다. (클래스 변수를 사용할 땐 클래스 이름.클래스 변수 형태로 사용하자! 인스턴스이름.클래스변수로 사용하면 인스턴스 변수로 착각할 수 있음)
- 지역 변수 : 메서드 내에 선언되어 메서드 내에서만 사용 가능하며, 메서드가 종료되면 소멸되어 사용 할 수 없게 된다. 변수 선언문이 실행될 때 생성된다.
메서드 : 특정 작업을 수행하는 코드들을 하나로 묶은 것
메서드를 사용하는 이유
- 높은 재사용성
- 중복된 코드 제거
- 프로그램의 구조
클래스 메서드와 인스턴스 메서드
클래스 메서드는 클래스 변수처럼, 객체를 생성하지 않고도 클래스이름.메서드이름 같은 식으로 호출이 가능하다. 반면에, 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
인스턴스 메서드는 인스턴스 변수와 관련된 작업을 하는, 즉 메서드의 작업을 수행하는데 인스턴스 변수를 필요로 하는 메서드이다.
반면 인스턴스와 관계없는 메서드를 클래스 메서드로 정의한다.
인스턴스 메서드 주의점
- 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
- 클래스 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- 클래스 메서드는 인스턴스 변수를 사용할 수 없다.
- 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.
클래스멤버는 언제나 참조 또는 호출이 가능하기 때문에 인스턴스 멤버가 클래스 멤버를 사용하는 것은 아무런 문제가 안된다. 클래스 멤버간의 참조 또는 호출 역시 아무런 문제가 없다. 그러나, 인스턴스멤버는 반드시 객체를 생성한 후에만 참조 또는 호출이 가능하기 때문에 클래스멤버가 인스턴스멤버를 참조, 호출하기 위해서는 객체를 생성하여야 한다.
오버로딩
오버로딩이란?
클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩이라고 한다.
오버로딩의 조건
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
오버로딩된 메소드를 호출할 경우, JVM은 매개 변수의 타입을 보고 메소드를 선택
매개 변수의 타입이 일치하지 않을 경우, 자동 타입 변환이 가능한지를 보고 메소드 선택
오버로딩이 아닌 경우
1. 매개 변수의 타입과 개수와 순서가 똑같은 경우, 매개변수 이름만 바꾸는 경우
2. 매개 변수의 타입과 개수와 순서가 똑같을 경우, 리턴 타입만 다르게 바꾸는 것
ex) println이 printlnBoolean, printChar 등등으로 나뉘지 않는다.
오버로딩의 장점
오버로딩을 통해 여러 메서드들이 하나의 이름으로 정의될 수 있다면, 그 이름만 기억하면 되므로 기억하기도 쉽고 이름도 짧게 할 수 있어 오류를 줄일 수 있다.
가변 인자와 오버로딩
가변인자는 타입... 변수명과 같은 형식으로 선언하며, 가변인자 외에도 매개변수가 더 있다면 가변인자를 매개변수 중에서 제일 마지막에 선언해야 한다.
생성자
생성자
- 객체를 생성할 때 호출되어 객체의 초기화를 담당
- 생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없음
- new 연산자에 의해 생성자가 성공적으로 실행되면 heap 영역에 객체가 생성되고 객체의 주소가 리턴됨
- 리턴된 객체의 주소는 클래스 타입 변수에 저장되어 객체에 접근할 때 이용됨
주의 : 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.
생성자 조건
1. 생성자의 이름은 클래스의 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
생성자는 여러개 일 수 있다.
생성자에서 다른 생성자 호출하기 - this(), this
1. 생성자의 이름으로 클래스 이름 대신 this를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
'자바' 카테고리의 다른 글
4. 상속 (0) | 2021.03.17 |
---|---|
2. 데이터 타입, 변수 (0) | 2021.03.11 |