프로그래밍/JAVA

자바 객체지향(2)

나도 오늘부터 개발자?! 2021. 12. 29. 18:10

오늘은 Chap 6-8 객체 배열부터 6-22 호출 스택까지 배웠고 배운 내용을 토대로 이야기를 해보도록 하겠습니다!

 

객체 배열은 참조 변수들을 하나로 묶은 참조 변수 배열이라고 해요 그래서 객체 배열 안에는 객체가 저장되는 것이 아니라 객체의 주소가 저장된다고 해요! 

그리고 객체배열을 생성하는 것은 객체를 다루기 위한 참조 변수들이 만들어진 것일 뿐이고 아직 객체가 저장되지는 않았어요 그래서 객체를 생성해서 각 요소에 저장을 해야 돼요!

위의 그림이 객체 배열을 생성하고 객체를 배열의 각 요소에 저장하는 방법이에요 ~

저는 이 부분을 배울 때 문득 배열을 만드는 이유는 값이 많아질수록 변수가 많아져서 변수를 만드는 번거로움을 없애기 위해서 아닌가? 근데 왜 그 번거로움을 객체 배열에서 만들고 있지?라고 생각을 했는데 for문을 이용해서 배열에 저장하는 방법이 있더라고요 ~ 

핫 하긴 저렇게 객체를 여러 개 생성해서 배열의 요소에 저장하는 건 비효율적이지라는 생각을 했어요 ㅋㅋㅋㅋ

 

클래스의 정의에 대해서 이야기해보려고 해요 

처음 프로그래밍 언어어에서 데이터 처리를 위해 변수라는 것을 만들어서 하나의 데이터를 저장할 수 있게 만들었는데 시간이 점점 흐르면서 데이터의 양이 많아져서 같은 종류의 데이터를 보다 효율적으로 다루기 위해서 배열이라는 개념을 도입했대요 그 후에 자료형의 종류에 상관없이 서로 관계가 깊은 변수들을 하나로 묶어서 다를 수 있도록 구조체라는 것을 만들었고 자바와 같은 객체지향 언어에서는 변수(데이터)와 함수(메서드)를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 클래스를 도입하게 되었다고 해요 ~

TIP: 자바에는 포인터와 구조체가 없고 C에 있다고 해요! 

 

프로그래밍 언어에서는 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가할 수 있는데 이것을 사용자 정의 타입(user-defined type)이라고 해요 그리고 자바에서는 클래스가 곧 사용자정의 타입이에요~

 

변수의 종류가 여러 가지라는 것을 알고 계신가요?! 저는 변수에 종류가 있을 거라는 생각조차도 못 했는데 오늘 선언 위치에 따른 변수의 종류가 있다는 걸 알게 되었어요! 

변수에는 클래스 영역에 사용되는 클래스 변수와 인스턴스 변수가 있고 메서드(생성자 내부) 영역에 사용되는 지역변수 이렇게 총 세 가지가 있는데 클래스 변수와 인스턴스 변수를 통틀어 멤버 변수라고 하며, 그 외에는 모두 지역변수라고 한대요 그리고 클래스 변수와 인스턴스 변수의 차이는 static의 유무라고 합니다! 

(자주색으로 동그라미랑 밑줄 쳐진 부분만 봐주세요!)

이제 각 변수에 대해 자세하게 이야기해보려고 해요

인스턴스 변수부터 말씀드리자면 클래스 영역에 선언되며, 인스턴스 변수(iv)의 값을 읽어 오거나 저장하려면 먼저 인스턴스를 생성해야 되고 인스턴스마다 별도의 저장공간을 가지므로 서로 다른 값을 가질 수 있어요 그래서 고유한 상태를 유지해야 하는 속성의 경우 인스턴스 변수로 선언한답니다 ~

 

클래스 변수는 인스턴스 변수와 달리 인스턴스를 생성하지 않고 언제라도 바로 사용할 수 있다는 특징이 있어요 그리고 모든 인스턴스가 공통된 저장공간(변수)을 공유하게 돼요 그래서 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 속성의 경우 클래스 변수로 선언을 해줘요 

 

지역변수는 메서드 내에 선언되고 메서드 내에서만 사용 가능하며, 메서드가 종료되면 지역변수는 소멸되어요 그래서 for문이나 while문의 블록 { } 내에 선언된 지역변수는, 선언된 지역변수 내에서만 사용이 가능해요 ~

클래스 변수와 인스턴스 변수를 헷갈려하실 거 같아서 예제를 하나 가져왔어요!

트럼프를 해야 하는데 숫자도 무늬도 모두 하트 4이면 트럼프를 할 수가 없죠? 그것처럼 인스턴스 변수도 각 변수들이 갖고 있어야 할 값들이 다양하기 때문에 인스턴스 변수로 선언해 주었어요 조금 더 예를 들면 게임 캐릭터를 생성할 때 머리 색상 얼굴 모양 등 변경할 수 있는 부분들이 다양하죠? 이렇게 인스턴스마다 개별적인 속성을 가져야 할 때, 인스턴스 변수를 선언해서 사용하고 반대로 클래스 변수는 모든 객체가 공통적으로 똑같은 속성을 가질 때 사용하는 것이라고 생각하면 좋을 거 같아요!

메서드, return문, 반환 값, 호출스택은 다음에 다시 수정해서 올리도록 하겠습니다 ㅠㅠ