Hayden's Archive

[자바/JAVA] 객체 지향 프로그래밍 본문

Study/Java & Kotlin

[자바/JAVA] 객체 지향 프로그래밍

_hayden 2020. 4. 13. 22:26

 클래스(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

 

선언 위치에 따른 변수 종류. 지역변수, 전역변수

네이버 지식IN에 답변한 내용을 옮겨 놓는다. [질문] 아두이노 초보인데요 간단한 질문이있습니다. void ...

blog.naver.com

 

선언(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

 

[자바/ Java] 명시적 생성자 / setter & getter / 캡슐화 / 접근 제어자

생성자 전반, 기본 생성자 관련 포스팅 : https://hayden-archive.tistory.com/60?category=775409 [자바/JAVA] 객체 지향 프로그래밍 클래스(Class) / 필드(Field) / 메소드(Method) - 변수(Variable) : 값이 저..

hayden-archive.tistory.com

 


 

 객체 지향 프로그래밍(OOP : Object Oriented Programing) 

- C언어 같이 절차지향 프로그래밍 언어의 경우 유지 보수 비용이 굉장히 많이 든다.(순서대로 이루어지므로 수정할 때 다 고쳐야 함. 규모가 큰 경우에는 더더욱!) C는 하드웨어 쪽으로 성능이 뛰어남. 초기 진입 장벽은 쉽고 크게 설계 안 하고 생각나는대로 만들면 되는데 나중에 유지보수할 때 힘듦.

- 객체지향 프로그래밍 언어의 경우 수정사항이 생길 경우 그 부분만 수정하면 됨. 확장성도 넓음. 하지만 설계가 너무 중요함. 그래서 초기에 작업할 때 간단하지 않고 어려움(그래서 한국은 설계하지 않고 외국의 설계를 갖다쓰는 경우가 많음)

- 자바는 객체지향 프로그래밍 언어지만 절차지향으로 프로그래밍할 수는 있음. 근데 그렇게 코드를 짜면 객체지향 프로그래밍 언어의 특성을 못 살리고 비효율적이다.

- 알고리즘 같은 경우에는 속도나 메모리의 경우 자바가 훨씬 많이 먹히고 C++이 빠름. 알고리즘 같은 경우에는 원시적으로 짜야 함