Object
자바에서 상속이란 필수적이다. 여러분이 상속하건 하지 않았건 기본적인 상속을 하게 된다. 자바에서 모든 클래스는 사실 Object를 암시적으로 상속받고 있는 것이다. 그런 점에서 Object는 모든 클래스의 조상이라고 할 수 있다. 그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서다.
ex) class O { } 클래스 O를 정의한다고 가정하면
class O extends Object { } 암시적으로 오브젝트를 상속하는 것과 같다.
enum
변수와 상수를 이용할 때 상수는 중복의 가능성이 매우크다. 그러므로 변수에 이름을 지어 활용을 많이 하는편이다. 변수를 많이 활용할 때에는 변수의 이름이 중복되는 문제를 회피하기 위해 앞에 접두사나 언더바를 이용해서 리네임을한다. 이러한 기법을 네임 스페이스라고 한다.
더 보다많은 변수를 사용해야 할 때 코드의 가독성을 위해 인터페이스로 구현한다. 접미사로 이름을 구분했던 부분이 인터페이스로 구분되기 때문에 언어의 특성을 보다 잘 살린 구조가 되었다. 인터페이스를 이렇게 사용할 수 있는 것은 인터페이스에서 선언된 변수는 무조건 public static final의 속성을 갖기 때문이다. 자 이러한 방식으로 이어나간다고 생각했을때 문제점이 있다. 두 가지 문제점이 있는데 하나는 변수를 네임할때는 switch 문에서 사용할 수 없고 또 하나는 선언이 너무 복잡하다는 것이다.
그래서 사용하는것이 enum이다.
enum은 열거형(enumerated type)이라고 부른다. 열거형은 서로 연관된 상수들의 집합이라고 할 수 있다. enum은 class, interface와 동급의 형식을 가지는 단위다. 하지만 enum은 사실상 class이다. 편의를 위해서 enum만을 위한 문법적 형식을 가지고 있기 때문에 구분하기 위해서 enum이라는 키워드를 사용하는 것이다. enum은 생성자를 가질 수 있고, enum의 생성자는 접근 제어자 private만을 허용한다.
enum을 사용하는 이유
- 코드가 단순해진다.
- 인스턴스 생성과 상속을 방지한다.
- 키워드 enum을 사용하기 때문에 구현의 의도가 열거임을 분명하게 나타낼 수 있다.
열거형의 특성을 정리해보면 열거형은 연관된 값들을 저장한다. 또 그 값들이 변경되지 않도록 보장한다. 뿐만 아니라 열거형 자체가 클래스이기 때문에 열거형 내부에 생성자, 필드, 메소드를 가질 수 있어서 단순히 상수가 아니라 더 많은 역할을 할 수 있다.
참조
int는 기본 데이터형(원시 데이터형, Primitive Data Types)이다. 자바에서는 기본 데이터형을 제외한 모든 데이터 타입은 참조 데이터형(참조 자료형)이라고 부른다. new 를 이용하여 만든 데이터 타입은 참조형 데이터 타입이라 부른다.
runvalue = 1, runreference = 2 가 출력된다. 둘이 같은 값인줄 알았지만 차이점이 있다. 변수 b에 담긴 인스턴스의 id 값을 2로 변경했을 뿐인데 a.id의 값도 2가 된 것이다. 이것은 변수 b와 변수 a에 담긴 인스턴스가 서로 같다는 것을 의미한다.
비유하자면 복제는 파일을 복사하는 것이고 참조는 심볼릭 링크(symbolic link) 혹은 바로가기(윈도우)를 만드는 것과 비슷하다. 원본 파일에 대해서 심볼릭 링크를 만들면 원본이 수정되면 심볼릭 링크에도 그 내용이 실시간으로 반영되는 것과 같은 효과다. 심볼릭 링크를 통해서 만든 파일은 원본 파일에 대한 주소 값이 담겨 있다. 누군가 심볼릭 링크에 접근하면 컴퓨터는 심볼릭 링크에 저장된 원본의 주소를 참조해서 원본의 위치를 알아내고 원본에 대한 작업을 하게 된다. 다시 말해서 원본을 복제한 것이 아니라 원본 파일을 참조(reference)하고 있는 것이다. 덕분에 저장 장치의 용량을 절약할 수 있고, 원본 파일을 사용하고 있는 모든 복제본이 동일한 내용을 유지할 수 있게 된다. 참조는 전자화된 세계의 극치라고 할 수 있다.
정리하면 변수에 담겨있는 데이터가 기본형이면 그 안에는 실제 데이터가 들어있고, 기본형이 아니면 변수 안에는 데이터에 대한 참조 방법이 들어있다고 할 수 있다.
메소드 _value의 인자로 a를 전달했다. 인자 a는 매개변수 b가 되어서 _value 안으로 전달되고 있다. _value 안에서 b의 값을 변경했다. _value가 실행된 후에 runValue에서 a값을 출력해본 결과 값이 변경되지 않았다. 호출된 메소드의 작업이 호출한 메소드에 영향을 미치지 않고 있다.
소드 _reference1 안에서 매개변수 b의 값을 다른 객체로 변경하고 있다. 이것은 지역변수인 b의 데이터를 교체한 것일 뿐이기 때문에 runReference1의 결과에는 영향을 미치지 않는다.
매개변수 b의 값을 다른 객체로 교체한 것이 아니라 매개변수 b의 인스턴스 변수 id 값을 2로 변경하고 있다. 이러한 맥락에서 _reference2의 변수 b는 runReference2의 변수 a와 참조 관계로 연결되어 있는 것이기 때문에 a와 b는 모두 같은 객체를 참조하고 있는 변수다.
매개변수를 다른 객체로 변경하는 것과 참조 데이터 타입의 매개변수에 담겨 있는 객체에 접근하는 것은 완전히 다른 의미를 가지기 때문에 두가지 경우의 차이점을 확실하게 이해하도록 하자.
처음에 이렇게 데이터 타입을 가지고 대입하는게 너무 헷갈리고 어려웠는데 예제를 들고나니 조금은 이해가 가는부분인 것 같다.
c언어에서도 포인터부분을 들을 때 헷갈리는게 이런 느낌이랑 비슷했던거 같았는데 그 때는 주소를 예를들어 설명해주셨는데
생활코딩님은 바로가기로 설명을 해주시니 왠지 더 명확하게 알 것 같은 느낌이었다. ㅋㅋㅋ...
그리고 이제 슬슬 국비지원 학원을 알아보고 있는데 너무 고민하게 된다. 후기나 강의평가.. 또 왠만한 학원들이 강남에 있어가지고 통학에 어느정도 시간을 쏟아야 할 것 같다 ㅠㅠ,, 3대 학원이라 불리는 뭐 쌍x, kh xx, 비트xx 등등..도 있고 중앙정보xxxx 부트캠프쪽에서는
코드xxxx,멋xx사xxx 에서는 최근에 국비지원으로도 가능한 걸로 알고있다. 아마 제일 추천했었던 3대 학원중에서 듣게 되지 않을까 싶다 ㅎㅎ.. 오늘은 이만 여기까지
'Java' 카테고리의 다른 글
Java 이클립스 (eclipse) 단축키 모음 (0) | 2022.12.07 |
---|---|
Java 기초 입문 9일차 (제네릭, Arraylist) (0) | 2022.12.07 |
Java 기초 입문 7일차 (예외처리 throws, checked, unchecked) (0) | 2022.11.24 |
Java 기초 입문 6일차 (Interface, 다형성, Exception, multi catch) (0) | 2022.11.23 |
Java 기초 입문 5일차 (classpath, API, 접근제어자, abstract) (0) | 2022.11.22 |