Hayden's Archive
[자바/JAVA] 객체 지향 프로그래밍 본문
클래스(Class) / 필드(Field) / 메소드(Method)
- 변수(Variable) : 값이 저장되는 공간. Value(값)와 다름.
- 클래스(Class)의 구성요소 / 클래스의 멤버 : 필드(Field), 메소드(Method)
- 필드(Field) : 클래스 바로 아래 온 변수를 필드라고 함. 필드는 클래스를 구성하는 요소들을 뽑아냄. 클래스의 멤버이므로 멤버 변수(Member Variable)라고도 함. ( 참고 : https://en.wikipedia.org/wiki/Member_variable )
(1) 정적 변수(Static Variable) : 필드(멤버 변수) 중에서 static이 붙은 것. (자세한 설명은 관련 포스팅 참고 : https://hayden-archive.tistory.com/64 )
(2) 인스턴스 변수(Instance Variable) : 필드(멤버 변수) 중에서 클래스가 인스턴스화 되었을 때(=객체 생성되었을 때) 그 인스턴스 안에 있는 변수 (아래 인스턴스, 객체 관련 설명 참고)
- 지역변수(Local Variable) : 메소드 안에서 만들어진 일시적인 변수.
필드 (여기서는 인스턴스 변수를 가리킴) | 지역 변수 |
1. 클래스 바로 밑, 메소드 바깥 2. 객체의 멤버이므로 기본값이 있다. (숫자는 0, boolean은 false, Class Type은 null) 3. JVM에서 Heap 안에 잡힘 4. Member Variable, Instance Variable, Object Variable * 전역 변수(Global Variable), 클래스 변수(Class Variable)랑 다름 |
1. 메소드 { 안 2. 기본값이 없다. 반드시 초기화하고 써야 한다. 3. JVM에서 Stack 안에 잡힘 4. Local Variable, Temporary Variable, Automatical Variable * 메인메소드 안에서 선언된 변수도 클래스 바로 아래 오는 변수는 아니므로 지역변수임 |
참고 : https://blog.naver.com/ann_arbor/221386061077
선언(Declaration) : ex) String name; int num;
= : 할당해주는(assign) 역할. 같다는 의미가 아님.
초기화(Initialization) : 변수에 값을 넣어주는 것. 사람은 왼쪽에서 오른쪽으로 코드를 보지만 기계는 반대로 봄. 그래서 name = Sally;는 Sally가 name이라는 공간에 들어가는 것.
선언과 초기화를 동시에 할 수 있다. ex) String name; name = Sally; -> String name = Sally;
메소드(Method) : 클래스를 통해 행하는 기능. 메소드 = 메소드 선언부 + 메소드 구현부. 클래스의 멤버이므로 멤버 함수(Member Fuction)라고도 함.
public class Greet {
// Greet 클래스 바로 밑에 온 name, message, classRoom, subject가 모두 필드
public String name;
public String message;
public int classRoom;
public String subject;
// sayHello() 메소드 -> void는 반환값 없음.
public void sayHello() {
System.out.println(name+", "+message);
}
// getStudent() 메소드 -> String 타입을 반환한다.
public String getStudent() {
return name + "\t" + message + "\t" + classRoom + "\t" + subject; //\t는 일정한 공백을 띄움
}
// setStudent() 메소드 -> 역시 void는 반환값 없음.
// 반환값 필요없고 그냥 찔러넣음. 값을 할당만 해주고 가지고 나오지 않음.
// String n, String m, int c, String s을 찔러넣고 가지고 나오는 반환값은 없다.
public void setStudent(String n, String m, int c, String s) {
name = n; //field 초기화
message = m;
classRoom = c;
subject = s;
}
}
객체(Object) 생성 / 생성자(Constructor)
- 클래스(Class) : 하나의 틀을 만드는 것. (ex: Programer)
- 객체(Object) : 실제 세계에 존재하는 개체 각각을 말함. 객체는 존재 자체만으로 유니크함. Real World에는 수많은 객체들이 있음. (ex: Programer1, Programer2, Programer3,...)
- 인스턴스(Instance) : 메모리에 올라가서 내가 사용할 수 있는 상태가 된 객체를 뜻하는 개념. 객체보다 인스턴스는 더 포괄적인 개념.
- 생성자(Constructor) : 객체를 생성할 때마다 호출되는 것. 객체가 생성되려면 반드시 생성자가 있어야 한다. 생성되는 객체는 전부 유니크하고 specific한 값을 가지므로 그 때마다 생성자가 호출된다.
(생성자는 정말 중요한 개념. 상속을 하지 않은 생성자는 이야기하기 어렵다. Encaptulation과도 연관됨.
- 기본 생성자(Default) : 인자값이 없는 생성자. 구현부에서 아무런 일도 하지 않는 생성자(=필드에 값 할당 안 한다는 소리) ex) 아래 그림을 보면 Shirt 클래스에서 public Shirt( ){ }
- 하나의 클래스에는 반드시 한 개 이상의 생성자가 존재한다. 내가 따로 만들어주지 않아도 알아서 기본 생성자는 만들어진다. 클래스에 아무런 생성자가 없다면 컴파일러(문법 체크, 타입 체크를 함)가 컴파일할 때 기본 생성자는 넣어준다. 기본 생성자는 null값을 가진다.
- 클래스를 만들면 객체를 생성해야(=메모리에 올려야/인스턴스화해야) 사용이 가능하다.
- Shirt sh; // 선언, sh = new Shirt(); // 값 할당 ===> 합쳐서 Shirt sh = new Shirt();
- 컴퓨터가 읽는 방향 ① new Shirt(); -> ② Shirt sh ===> ① Shirt 클래스의 생성자를 호출(Shirt();)해서 Heap에서 객체를 만들 건데(new) -> ② Stack에 Shirt 클래스 데이터 타입(Shirt)의 sh라는 공간=참조변수(sh)를 만들고 그 공간에 주소값을 할당한다.
- 명시적 초기화를 안 했을 경우의 객체 생성 다시 정리
① 묵시적 초기화 : 객체의 필드는 무조건 값을 가진다. 내가 값을 안 줘도 묵시적 초기값을 가진다. 위 그림에서는 명시적 초기화(Explicit Initialization)를 안 했기 때문에 기본적인 묵시적 초기화(Implicit Initialization)가 이루어져 있다. Shirt처럼 Class Data Type일 때는 아무런 값을 안 줘도 기본값으로 null이라는 값을 가진다.
② 주소값 할당 : 의미 없는 값이라도 값은 값이니까 위치값을 가진다. Stack 영역에 Local Variable(ex: sh 변수)에 주소값 할당
③ 참조가 일어남(ex: sh.maker ===> 여기서 sh는 참조변수(Reference Variable). 생성된 객체의 주소값을 가지고 있다.
명시적 생성자 관련 포스팅 : https://hayden-archive.tistory.com/61
객체 지향 프로그래밍(OOP : Object Oriented Programing)
- C언어 같이 절차지향 프로그래밍 언어의 경우 유지 보수 비용이 굉장히 많이 든다.(순서대로 이루어지므로 수정할 때 다 고쳐야 함. 규모가 큰 경우에는 더더욱!) C는 하드웨어 쪽으로 성능이 뛰어남. 초기 진입 장벽은 쉽고 크게 설계 안 하고 생각나는대로 만들면 되는데 나중에 유지보수할 때 힘듦.
- 객체지향 프로그래밍 언어의 경우 수정사항이 생길 경우 그 부분만 수정하면 됨. 확장성도 넓음. 하지만 설계가 너무 중요함. 그래서 초기에 작업할 때 간단하지 않고 어려움(그래서 한국은 설계하지 않고 외국의 설계를 갖다쓰는 경우가 많음)
- 자바는 객체지향 프로그래밍 언어지만 절차지향으로 프로그래밍할 수는 있음. 근데 그렇게 코드를 짜면 객체지향 프로그래밍 언어의 특성을 못 살리고 비효율적이다.
- 알고리즘 같은 경우에는 속도나 메모리의 경우 자바가 훨씬 많이 먹히고 C++이 빠름. 알고리즘 같은 경우에는 원시적으로 짜야 함.