이웃추가본문 기타 기능
정말 중요한 핵심적인 부분을 배워간다는 느낌이 많이 드는 요즘인데, 이러 저러한 일로 매우 피곤함을 느끼곤 한다.
현재 자바를 8버전으로 다시 설치를 했고 세팅도 새로 했다.
자바에서의 모든 파일의 기본이 되는 클래스에 대해 배웠다.
클래스 (class)
- 자바를 이루고 있는 객체 (Object) 로 모든 자바의 내용은 클래스 안에 들어있음
- 클래스는 내부에 멤버라고 불리는 값 (변수, 상수)과 기능 (메소드) 으로 구성되어 있음
멤버변수 : 클래스가 가지고 있는 특징으로 변수나 상수의 형태로 존재하며 클래스 전체에서 사용이 가능
멤버메소드 : 보통 그냥 메소드라 하며 클래스로 해야하는 여러 기능을 구현해 놓은 것
- 클래스는 자료형으로도 사용됨 (자료형으로서 인스턴스를 생성하게 해줌)
우리가 메소드와 변수, 상수는 알고 있지만 클래스를 통해 멤버 변수, 멤버 상수, 멤버 메소드를 사용할 수 있다는 것은 처음 접해보지만 이해하기 어렵지는 않았다. 하지만 클래스의 생성은 곧 인스턴스의 생성과 이어진다는 것도 처음 알았다.
인스턴스 (instance)
- 클래스를 기반으로 하여 생성되는 객체로서 일반적으로 프로그래밍에서 객체라 함은 인스턴스를 의미
- 주로 다른 클래스의 멤버 (대부분 메소드) 들을 사용하기 위해 생성하는 경우가 많다.
- 이름은 변수랑 동일한 방법으로 지어서 사용함 (선언법도 변수랑 동일하나 생성법은 다름)
- 선언 및 생성법 : 클래스명 인스턴스명 = new 클래스명([매개변수]);
변수는 선언과 동시에 생성되지만 인스턴스는 선언과 생성은 별개로 동작함
변수는 선언과 동시에 메모리에 공간을 할당 받지만 인스턴스는 생성을 해야 할당 받음
간단히 말해서 클래스에서 선언한 것들을 가져다 쓰고 싶어서 인스턴스를 사용한다. 근데 변수와 인스턴스의 차이점 때문에 생성자가 있어야만 사용 가능하다.
생성자(constructor)
- 모든 클래스에 하나 이상 존재하는 일종의 메소드로 인스턴스를 생성시키는 작업을 함
생성자를 정의하지 않으면 JVM에서 자동으로 디폴트 생성자를 만들어 줌
- 생성자는 인스턴스 생성시에만 딱 한 번 동작됨 (두 번 다시 호출 못함)
다시 호출하려면 다른 인스턴스를 생성해야함 (인스턴스당 한 번만 실행됨)
- 생성자의 이름은 반드시 클래스와 동일해야함 (첫 글자를 대문자로 지어야함)
- 생성자는 리턴타입을 입력하지 않음 (void도 입력 안함)
- 인스턴스 생성외에 주로 멤버변수들의 초기화에 많이 사용됨
이 세가지를 배우고 많은 예제를 풀었다. 정말 활용할 수 있는 예제들이 많았지만 아직은 미숙해 좀 더 많이 풀어보고 많은 에러를 겪어봐야 익숙해질 것 같다. 예제를 풀면서 겪은 에러중 메소드 선언시 public으로 선언을 해 멤버변수들에 접근이 쉬워 지맘대로 바꿀수 있는 상황이 가능해져 프로그램이 이를 막아 에러가 생겼다. 그래서 정보은닉을 활용했다.
정보은닉 (information hiding)
- 다른 클래스에서 인스턴스를 통해 멤버에 직접적으로 접근하는 것을 막는 것
단, 대부분 멤버변수에 대한 보안으로 사용됨 (경우에 따라 메소드에도 사용되기도 함)
- 접근을 막아야 하는 멤버의 접근제어지시자로 'private'을 사용하면 됨
멤버 변수에는 거의 모두 붙여야함 (붙지 않는 멤버변수가 있으면 정말 붙이지 않아도 되는지 확인해야 함)
단, 멤버상수에는 붙이지 않는 겨우도 종종 존재함
- private이 붙는 멤버변수의 값을 참조하거나 변경하려면 메소드 (setter, getter) 를 통해 작업해야함
메소드를 통하면 값의 유효성 검사들을 할 수 있기 때문에 메소드를 통해 접근과 작업을 해야 함
멤버변수의 성격에 따라 setter나 getter 둘 중 하나만 있거나 둘 다 없을 수도 있음
정보은닉이 나오면서 접근제어지시자에 대해 자세히 알아보지 않을 수 없었다.
접근제어지시자 (access control specifiers)
- 클래스와 멤버들에 대한 접근 권한을 부여하는 명령어
지시자 같은 클래스 동일 패키지 상속 클래스 기타 영역
private O X X X
default O O X X
prtected O O O X
public O O O O
- private : 한 클래스 내에서만 접근이 가능한 가장 쳬쇄적인 지시자로 보통 멤버변수와 클래스 내에서만 사용하는 메소드 등에 붙임
- default : 같은 패키지 (폴더) 안에서 접근이 가능하며, 지시자를 생략한 상태를 의미
- protected : 같은 상위 (슈퍼) 클래스를 가지거나 상속받은 클래스에서도 접근이 가능한 상태
- public : 모든 영역에서 자유롭게 접근을 허용하는 지시자
클래스에 public을 붙이는 경우 한 파일 (.java) 에 여러 개의 클래스가 있으면 그 중 하나에만 붙일 수 있음
public이 붙는 클래스가 그 파일의 이름이 됨
이런 시스템이 어려웠지만 내 나름대로 해석해 이해했다.
원하는 기능을 클래스로 만들고 ( 클래스 안에 원하는 기능을 가지는 메소드들을 생성 ) 인스턴스를 생성해서 원하는
기능을 가진 클래스를 자료형으로 넣고 ( 이런 방식으로계산을 하겠다는 말 ) 인스턴스에 값을 넣어 원하는 기능을
실행 -> 멤버 변수와 멤버 메소드 이용
그리고 점점 더 귀찮고 코드를 줄이는 방법을 사용해 클래스 멤버라는 것을 이용하는데 조금 특이하다.
클래스 멤버 (static)
- 멤버들 중 "static" 이라는 키워드가 붙는 멤버들을 클래스 멤버라고 함
일반적으로 멤버라고 하면 인스턴스 멤버를 의미하며, 인스턴스를 빼고 그냥 멤버라고 함
- 클래스 멤버는 인스턴스 멤버와 다르게 인스턴스 안에 존재하지 않고 메모리 상에 따로 존재함
모든 인스턴스에서는 클래스 멤버를 공유함 (동일한 값으로 공유)
- 인스턴스와 상관 없이 클래스 이름으로 접근이 가능하며, 인스턴스를 통해서도 접근이 가능함
단, 될 수 있으면 클래스 이름으로 접근하는 것이 좋다 (인스턴스 멤버와의 구분을 위해서라도...)
- 클래스 멤버는 인스턴스가 생성되기 전에 이미 메모리에 생성되어 있음
JVM이 클래스를 실행할 때 제일 먼저 메모리에 클래스 멤버를 생성시킴
- 클래스 메소드로 지정하려면 반드시 메소드 내부에서 인스턴스 변수를 참조하는 일이 없어야 함
일반 메소드에서 클래스 변수를 참조할 수 있으나, 클래스 메소드에서는 인스턴스 변수를 참조할 수 없음