외부에서 클래스를 이용할 때 


클래스 내부의 필드는 못 사용하게 하고, 메소드는 사용할 수 있게 설정할 수 있는 이유는


JAVA에 접근 지정자가 존재하기 때문이다.



접근 지정자는 외부에서 클래스를 접근할 때 접근 하는 범위를 한정하겠다는 의미이다.


접근 지정자는 좁은 범위에서부터 private, default, protected, public 4가지로 나뉘어져 있다.





#private


private으로 선언된 것은 외부에서 직접적인 사용이 불가능하다.


필드(field)의 경우에는 외부에서 내부의 필드를 직접이용할 수 없고.


메소도(method)의 경우에도 메소드를 직접 접근할 수 없게 된다.




private은 주로, 데이터의 손실과 소멸을 방지하기 위해, 


클래스(class)내부의 데이터의 직접적인 접근을 금할 때 사용된다.


클래스를 상속받을 때 부모클랙스의 모든 것을 자식클래스가 이용가능하다고 말하나. 


private field나 method를 가진 클래스를 상속받으면


private으로 적힌 것들은 자신의 것처럼 직접적으로 이용할 수 없다.


왜냐하면, 자기 자신 이외에는 아무도 접근할 수 없게 명시하였기 때문이다.





#default


자바(Java)에서 프로젝트(Java Project)를 먼저 생성하게 되면, src 폴더가 생성되는데,


개발자는 주로 여기에 패키지(Package)를 만들어, 자바(Java)의 클래스파일들을 효율적으로 관리한다.




default로 선언되게 되면, 같은 Package내에 있는 모든 곳에서 접근할 수 있게 된다.


필드나 메소드를 만들때, 앞에 접근 지정자를 적지 않으면, 


기본적으로 default로 인식한다.





#protected


protected는 주로 상속관계를 사용할 때 자주 볼 수 있는데,


Package의 동일유무와 상관없이 protected가 선언된 클래스를 상속받은 모든 클래스들은 


상속받은 클래스 내부의 protected타입의 모든 것을 자신의 것처럼 이용할 수 있다.





#public 


우리가 클래스에서 가장 많이 볼 수 있는 접근 지정자로,


클래스 내부의 public 으로 선언된 모든 것을 제한없이 외부의 어떤 곳이든지 이용할 수 있다.


Package동일유무, 상속유무와 상관없이 어떤 클래스라도 사용이 가능하며,


대부분의 클래스의 메소드들은 클래스내부의 필드를 


간접적으로 접근하여 이용할 수 있도록 하기 때문에, public으로 선언되어 있다.

'JAVA' 카테고리의 다른 글

IntelliJ 설치  (0) 2018.10.26
final  (0) 2018.01.19
cmd로 클래스 실행  (0) 2018.01.19
class간의 관계  (0) 2018.01.18
Class의 기본구조  (0) 2018.01.18

 자바(JAVA)는 모든 클래스들이 서로 관계를 맺고 있다.


이런 관계는 Has ~a관계와 Is ~a 관계로 크게 2개로 구분할 수 있다.





#has ~a관계


has ~a관계는 '~는 ~을 가지고 있다'라는 것을 의미한다.




노트북을 예시로 들어서 설명하자면, 


내가 사용하고 있는 노트북에는 여러기능들이 존재한다.


노트북음향을 조절하는 기능, 노트북화면의 밝기를 조정하는 기능들이 존재하는데,


내가 음향을 조절하는 기능을 이용하지 않는다고 가정해보자.


그럼 내 입장에서는 노트북에 굳이 음향을 조절하는 기능을 넣을 필요가 없는 것이다.


나와 같은 사람들이 많이 존재한다면, 


노트북 만드는 회사에서는 음향조절기능을 뺀 노트북과 음향조절기능이 있는 노트북을 둘다 만들어야 할까?


아니면 음향조절기능이 있는 노트북만 만들어야 할까?


정답은 후자, 음향조절기능이 있는 노트북만 만들어야 한다는 것이다.


왜냐하면, 음향조절기능을 가진 노트북은 


음향조절이 필요치 않은 사람과 음향조절이 필요한 사람 모두를 만족시키기 때문이다.


필요하지 않은 사람이 있다고 해서 그 기능을 뺀 제품을 만들 필요는 없다.


필요한 사람은 사용하면 되고, 필요하지 않은 사람은 사용하지 않으면 된다.


즉, 노트북을 만드는 회사는 모두에게 보편적으로 이용가능한 노트북을 생산해야 한다는 것이다.




다시 has ~a관계로 돌아와서 이야기 하자면, 


has ~a는 한 클래스 내부에서 외부에 정의된 클래스를 이용하는 관계이다.


외부에서 가져오는 클래스는 앞에서 설명했던 노트북과 같이 


어느 누가 가져와서 사용하든 보편적이여야 하며, 독립적으로 이용가능하여야 한다.


이러한 클래스를 Data Class라고 한다.


데이터 클래스(Data Class)는 말 그대로 데이터들만 담겨 있는 클래스로서,


클래스 내부에는 데이터와 외부에서 데이터를 접근할 수 있는 메소드들이 존재한다.




외부에서 클래스를 가져와 데이터의 입출력만 한다면 그것은 데이터 클래스이나,


클래스 내부의 데이터를 가지고 연산을 하고, 값을 처리하거나 출력하는 기능을 하게 된다면,


이는 데이터 클래스가 아닌 데이터들을 관리하는 데이터 관리 클래스가 된다.




has ~a관계는 데이터클래스와 데이터관리클래스로 나타낼 수 있다. 


<사용예시>








#Is ~a관계


Is ~a관계는 '~는 ~이다'라는 것을 의미하며, JAVA에서 상속이라고도 불린다.


상속이란, 한 클래스가 가진 모든 것을 다른 클래스에 물려주는 것이다. 


상속을 하는 클래스를 우리는 부모클래스, Super Class라고 부르며, 


상속을 받은 클래스를 자식클래스, Sub Class라고 부른다. 


Java에서는 모든 클래스들이 상속구조를 이루고 있기 때문에, 


맨 위로 올라가게 되면 모든 클래스의 최종 부모클래스가 존재하는데,


이를 최상위클래스라고 한다. 





상속을 이용할 경우, 가장 중요한 것은 Class간의 연관성이 존재해야 한다는 것이다.


pen이라는 클래스를 생성하고 water이라는 클래스를 생성했다고 가정해보자.


pen클래스와 water클래스 관계내에는 연관성이 존재하지 않는다. 


그렇기 때문에, 개발자가 pen클래스에서 사용하는 함수(메소드)를 이용하기 위해


water클래스에 pen클래스를 상속할 경우, 이는 Is ~a관계에 어긋나게 된다.


water이 pen일 수는 없다.




상속은 클래스명 옆에 extends 클래스명을 적게 되면 적혀진 클래스를 상속받게 되는데,


우리가 처음 클래스를 만들 경우에는 extends가 존재하지 않는다.


그러면 상속을 받지 않는 것일까?



정답은 아니다. 


모든 클래스는 생성과 동시에, 최상위 클래스인 Object클래스를 상속받게 된다.



코드상에서 상속을 받지 않는 것처럼 보이지만, 


사실은 이미 클래스가 만들어질때 부터 상속은 이루어진 것이다. 




[상속의 특징]


상속은 최상위 클래스에서 최하위자식클래스로 갈수록 추상화가 이루어진다.


추상화란 추상적인 개념을 구체화하는 행위를 의미한다. 


예시를 들어 설명을 하자면, 동물을 생각하면 무엇이 떠오르른가?


토끼, 인간, 양서류 등의 몇몇 단어들이 떠오르게 될 것이다.


이러한 단어들은 모두 동물이란 단어과 연관성이 있으며,


동물들을 구체적으로 설명하였다고 할 수 있다.


또한 토끼, 인간과 같은 단어들 속에서 동물만이 가질 수 있는 공통점들을 찾을 수 있을 것이다.


숨을 쉬고, 귀가 있다는 공통점들은 토끼와 인간 뿐만 아니라,


모든 동물들에게 해당될 수 있는 공통점이다.


이러한 공통점을 우리는 토끼를 명시할때나, 혹은 인간을 명시할때,


일일히 명시할 필요가 있을까?



공통점들만을 모아 부모클래스로 구성하여 상속관계를 맺는다면,


자식클래스는 이러한 공통점들을 가질 수 있으며, 자신만의 다른 점을 추가할 수 있다. 


즉, 다르게 말하면, 자식클래스 입장에서는 부모클래스의 공통점만으로 


자신을 완벽하게 표현 할 수 없다고 생각할 수 있다는 의미이다.


그렇기 때문에, 부모클래스의 공통점을 받고, 자신만의 특징을 추가하는 자식 클래스는 


부모클래스가 자신을 나타내는 것 보다 , 자신을 보다 추상화하고 있다고 할 수 있다.



'JAVA' 카테고리의 다른 글

IntelliJ 설치  (0) 2018.10.26
final  (0) 2018.01.19
cmd로 클래스 실행  (0) 2018.01.19
접근 지정자  (0) 2018.01.19
Class의 기본구조  (0) 2018.01.18

Java는  class단위로 코드를 구성한다.


class의 기본적인 구조는 크게 3가지로 구분할 수 있다.




#field


[기본형태 : 접근지정자 데이터타입(dataType) 변수명]


필드라고 불리기도 하고, 변수라고 불리기도 하는 이것은, 


한 class내에서 모든 메소드(method)이 접근가능한 변수를 의미한다.




이러한 필드는 인스턴스(instance) 필드와 스테틱(static)필드 두가지로 구분되는데,


인스턴스 필드(instance field)는 말 그대로 객체, 즉 클래스(class)를 생성했을 시에 같이 생성되는 필드이다.


스테틱 필드(static field)은 객체가 생성되기 이전에 객체보다 먼저 생성되는 필드로서, 


객체의 생성유무와 연관성이 없기 때문에, 어떤 클래스에서도 공통적으로 사용할 수 있다.






#method


[기본형태 : 접근지정자 리턴타입(return type) 함수명(메소드명) (매개변수)]


메소드(method)는 기능을 가진 함수라고 할 수 있다.




개발자가 클래스외부에서 클래스를 이용할 경우, 


정보보호와 은닉을 위해 클래스의 직접적인 필드을 건드리지 못한다.


그러나 메소드를 이용하면 메소드(함수)는 클래스 내부에 위치해 있기 때문에, 


같은 클래스 내부의 필드를 이용하거나, 값에 대한 수정이 가능하다.


클래스의 외부와 클래스 내부의 필드를 연결해주는 다리의 역활을 한다고 말할 수 있다.




메소드(method)도 필드와 마찬가지로, 


인스턴스 메소드(instance method)와 스테틱 메소드(static method)로 구분할 수 있다.


설명은 필드와 동일하다.


여기서 하나, 인스턴스 메소드와 스테틱 메소드의 차이를 말하자면,


인스턴스메소드는 this가 이용가능하나, 스테틱메소드는 this가 이용불가능하다.


this에 대한 설명은 블로그내의 'this와 super의 이용'에서 자세히 설명하고 있다.






#constructor


생성자는 말 그대로 생성을 하는 역활을 하는데, 정확하게 이야기를 하자면,


객체를 등록하는 역활을 한다고 할 수 있다.


객체를 만들기 위해서 우리는 main에서 아래와 같은 코딩을 하는데,



여기서 new뒤에 오는 No4() 이부분이 생성자를 호출하는 부분이다.


위와 같은 코드를 실행하면 main은 No4의 생성자로 이동하여,


생성자는 객체를 등록하게 되고, main은 이 객체를 인식하여 이용할 수 있게 된다. 




생성자는 주로 개발자가 클래스(class)내의 필드(field)를 초기화해줄 때 이용된다.


생성자의 생김새는 아래와 같다.




생성자의 가장 큰 특징중 하나는 리턴타입(return type)이 없다는 것과 시작글자가 대문자라는 것이다.


객체를 등록하는 역활을 하기 때문에, 반환값이 필요하지않으며,


생성자의 이름은 클래스의 이름과 동일해야 하기 때문에,


클래스의 시작글자가 대문자인 것처럼, 생성자의 시작글자 또한 대문자이다.




그런데, 우리가 객체를 만들 때 따로 생성자를 만들지 않고 객체를 등록하여 이용한다.


이렇게 할 수 있는 이유는 바로 객체 내에는 생성자가 이미 존재하기 때문이다.


눈에 보이지 않지만, 객체등록을 위해 생성되있는 생성자를 "default constructor"라고 한다.


이 디폴드 생성자(default constructor)는 개발자가 생성자를 하나도 명시하지 않았을 경우에 존재한다.


만약 개발자가 하나라도 명시할 경우에는, default constructor는 존재하지 않기 때문에,


개발자가 따로 명시를 해줘야 한다.




생성자는 또한 오버로딩(overloading)이 가능한다.


 + [오버로딩(overloading)]


   : 오버로딩이란, 개발자가 동일한 기능을 하는 메소드들을 만들때, 


    같은 메소드(method)명을 가지고, 각각 다른 매개변수를 지정하고 싶을 때 사용하는 기법이다.


    JAVA는 함수명(메소드명)이 동일해도 매개변수의 타입과, 매개변수의 갯수가 다르다면,


    상황에 맞추어 알맞은 메소드들을 찾아간다.


 < 오버로딩(overloading) 사용예시>







'JAVA' 카테고리의 다른 글

IntelliJ 설치  (0) 2018.10.26
final  (0) 2018.01.19
cmd로 클래스 실행  (0) 2018.01.19
접근 지정자  (0) 2018.01.19
class간의 관계  (0) 2018.01.18

+ Recent posts