객체 지향 프로그래밍 OOP
자바라는 언어에 꼭 따라 붙는 수식어가 있다. 바로 객체 지향이다. 영어로는 Object Oriented Programing 줄여서 OOP 라고 한다. 객체지향 프로그래밍이란 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것이다. 각각의 객체는 메시지를 주고 받고, 데이터를 처리할 수 있다.
클래스 Class
- 객체를 생성하려면 객체를 만들기 위한 설계도가 필요하다. 클래스가 바로 객체의 설계도이다.
- 연관되어 있는 변수와 메소드들의 집합이다.
필드 Field
Type Field;
타입 필드;
- field, member, 필드, 클래스 멤버변수, 멤버변수, 전역변수 ... 비슷한 용어를 사람에 따라 혼용해서 사용한다.
- 필드는 객체의 속성을 저장한다.
- 생성자와 메소드 밖에서 선언되어 생성자와 메소드 전체에 사용된다.
- 필드의 초기값은 선언시에 할당할 수도 있고, 할당되지 않으면 타입에 따라 초기값이 자동으로 할당된다.
- Member 클래스 필드 선언
package com.sample;
public class Member {
String name;
int age;
}
- 외부 클래스에서 Member 필드값 사용
package com.sample;
public class MemberInformation {
public static void main(String[] args) {
Member member = new Member();
member.name = "김철수";
member.age = 18;
}
}
MemberInformation 이라는 메인 메소드를 가진 외부 클래스에서 도트연산자( . )를 이용해 Member 클래스의 필드값을 사용하려고 한다.
Member member = new Member();
필드는 객체에 소속된 데이터이므로 우선 new 연산자로 객체를 생성해준다.
member.name = "홍길동";
member.age = 18;
만들어진 객체는 도트연산자( . )를 통해서 객체가 가지고 있는 필드와 메소드에 접근할 수 있다.
생성자 Constructor
ClassName ( parameter ) {
}
클래스이름 ( 매개변수 ) {
}
- 생성자는 객체생성과 필드 초기화의 역할을 한다.
- 클래스 이름과 동일한 이름을 가진다.
- new 연산자로 호출한다.
- 리턴 타입이 없다.
- 생성자를 생략하면 자동으로 기본 생성자가 생성된다. 따라서 클래스에 생성자를 선언하지 않아도 new 연산자 뒤에 기본 생성자를 호출하여 객체를 생성할 수 있다. 그러나 클래스가 선언한 생성자가 하나라도 있으면 컴파일러는 기본 생성자를 자동으로 만들어주지 않는다.
- 생성자 선언
public class Member {
public Member(String name, int age){
}
}
파라미터의 선언은 생략할 수도 있고, 여러개를 선언해줄 수도 있다. 파라미터는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 내부로 전달하는 역할을 한다.
- 생성자 호출과 객체 생성
public class MemberInformation {
public static void main(String[] args){
Member member = new Member("김철수", 18);
Member member = new Member(); //오류
}
}
생성자에 파라미터가 선언되어 있다면, 객체를 생성할 때 반드시 파라미터를 초기화시켜줘야 한다. Member 생성자는 name과 age 라는 파라미터가 선언되어 있는 생성자만 존재하기 때문에 기본 생성자가 자동으로 만들어지지 않고, 따라서 기본생성자를 호출할 수 없다.
- 필드 선언 시 초기화
public class Member {
String name;
int age = 18;
}
Member 클래스에 다음과 같이 필드를 선언하면서 동시에, age에 18이라는 초기값을 설정해주었다.
Member m1 = new Member();
Member m2 = new Member();
그리고 Member 클래스로 부터 m1, m2 객체를 생성하게 되면 m1과 m2 객체의 age 값은 18로 저장이 되어있다.
- 생성자 내에서 초기화
public class Member {
// 필드
String name;
int age;
// 생성자
public Member(String name, int age) {
this.name = name; // 필드name.파라미터name
this.age = age; // 필드age.파라미터age
}
}
일반적으로 필드와 동일한 이름의 파라미터를 사용한다. 필드와 파라미터를 구분 짓기 위해서 ' this . ' 을 필드 앞에 붙여준다.
Member m1 = new Member("김철수", 18);
Member m2 = new Member("박영희", 24);
"김철수", "박영희" 는 파라미터 name을 통해서 필드 name 의 초기값이 되고, 18, 25는 파라미터 age를 통해서 필드 age의 초기값으로 사용된다.
- 생성자 오버로딩
public class Member {
public Member(String name) {
}
public Member(String name, int age) {
}
}
생성자 오버로딩은 파라미터를 달리 하는 생성자를 여러 개 선언하는 것이다.
Member m1 = new Member("김철수");
Member m2 = new Member("박영희", 24);
메소드 Method
객체 Object/ Instance
ClassType var = new Constructor();
클래스타입 변수 = new 생성자();
- 설계도인 클래스를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체
- 메모리에 실제 구현할 구현체
- 객체의 생성은 객체화, 인스턴스화라고도 한다. new 연산자로 클래스의 생성자를 호출함으로써 객체가 생성된다.
헷갈리는 용어
- 클래스 멤버 : 필드, 생성자, 메소드
- 클래스 변수 : 클래스로 선언한 변수
댓글