Java의 기본 log 기능 정리


http://www.gisdeveloper.co.kr/?p=5174#comment-25326



Java에서 기본으로 제공하는 log 기능에 대해 정리한 글.


  1. log에 대한 수준별로 출력하는 메소드
  2. 나만의 log를 설정하게 해주는 클래스
  3. log를 file로 저장하게 해주는 방법.


'프로그래밍 > JAVA' 카테고리의 다른 글

캡슐화(Capsulation)  (0) 2018.08.07
다형성 (polymorphism)  (0) 2018.07.20
상속(Inheritance)  (0) 2018.07.20
클래스 - 다른 클래스의 메소드 호출  (0) 2018.05.17
Return data type에 대한 검색 및 정리.  (30) 2018.05.03


캡슐화(Capsulation)




캡슐화는 목적이 객체의 기능 보호에 있다.

만일 어떤 메소드나 필드가 항상 모두에게 공개되어 있다면, 입력 시킨 값이나 메소드의 내용을 누구나 가져가서 사용할 수 있고, 수정할 수

있게 되므로, 보안에 취약한 형태가 될 수 밖에 없다.

따라서, 외부 객체가 호출하거나 읽고 쓸 수 있는 메소드, 필드의 범위를 접근 제한자를 통해서, setter,getter 메소드를 통해서 정해 줄 수 있는

기능을 가질 필요가 있다.



접근 제한자 (Access Modifier) 




public : 모든 클래스에서 접근 가능한 필드, 메소드.

protected : 자신과, 상속받은 자식 클래스에서만 접근 가능한 필드 메소드.

default : 같은 패키지 내의 클래스에서만 접근 가능한 필드 메소드.

private : 자신만 사용 가능한 필드, 메소드



다형성 (polymorphism)


객체 지향 프로그래밍에서, 같은 타입이지만, 다양한 객체를 같은 타입처럼 이용할 수 있는 성질.

하나의 타입 Bread = new Doughnut(); 다른 객체로 대입이 가능하다.

먼저 이러한 성질을 사용하기 위해서는, 인터페이스와 상속의 개념이 꼭 필요하다.

다형성을 위해서 자바에서 갖추고 있는 기능은, 부모 클래스와 인터페이스의 타입 변환이 가능하다는 점이다.

부모 타입 <=== 자식 타입

인터페이스 타입 <== 모든 구현된 클래스(객체)

이 다형성의 효과로 객체를 마치 기계의 부품처럼 사용할 수 있는 장점이 생긴다.

예) 자동차의 타이어는 어떤 타이어든 호환만 된다면 모두 장착 할 수 있는 것과 비슷하다.



다형성과 관련된 부분들


타입 변환 : 같은 타입이지만, 실행 결과가 다양해질 수 있는 객체를 이용할 수 있다는 성질.


하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해줌.


즉 객체를 부품처럼 이용하는 것이 가능해짐.


자식 클래스 타입을 부모 클래스 타입으로 변환하는 것이 가능하기 때문에, 이것이 가능하다.


자동 타입 변환 : 부모 클래스 타입의 변수가 자식 클래스 타입 객체를 참조하면 자동으로 부모 클래스 타입으로 변환이 되는 것.


자동 타입 변환이 일어날 수 있는 이유는, 자식 클래스는 부모 클래스의 특징과 기능을  상속 받아서 만들어졌기 때문에 가능한 것.


또한 상속 계층에서 상위 타입이면 무조건 자동 타입 변환이 일어날 수 있다. (부모가 아니라 2단계 상속 받은 상태라도 변환 가능)


메소드 오버라이딩 : 메소드가 자식 클래스에서 오버라이딩 되었을 경우에는, 자식 클래스의 메소드가 호출된다.


한번 자식 클래스에서 변환된 메소드는 타입 변환 후에도 항상 자식 클래스의 메소드로 호출된다.



메소드 오버로딩 : 메소드 오버로딩은 같은 이름의 메소드가 입력 받는 값에 변화를 주어 동작할 수 있는 가능성을 더 여러가지로


가질 수 있게 해주는 기능이다. 이 역시 다형성의 측면에서 행동하는 기능이라고 생각 할 수 있다.


만일, 오버로딩이 존재하지 않는다면 하나의 이름을 가지는 메소드는 오직 정해진 타입, 갯수의 변수 만을 받을 수 밖에 없는 형태


이기 때문에, 자유도적인 부분에서 상당히 떨어질 수 밖에 없다.



































상속 (Inheritance)


부모 클래스 : 상위, super 클래스라고도 한다.


자식 클래스 : 하위, 파생 클래스라도도 한다.



부모 클래스의 필드와 메소드를 자식 클래스에서 물려받아, 사용 할 수 있는 것을 말한다.


현실과는 다르게 상속의 권한은 자식에게 있다. (Extends)


상속 받은 재산을 자식이 마음대로 사용할 수 있듯이, 자식은 상속받은 필드와 메소드의 내용을 마음대로


변경이 가능하다. (메소드 재정의, 오버라이딩)


부모 클래스 또한, 일부, 또는 클래스 전체를 상속 거부할 수 있게 만드는 기능이 있다.(final)


부모 클래스는, 자식 클래스를 제외한 모든 클래스가 접근을 막게 할 수있다.(protected)


자식 클래스 타입의 메소드나 필드는 부모 클래스 타입의 변수에 대입시에 자동적으로 부모 클래스 타입으로 변환된다.(자동 타입 변환)




상속 : 자식 클래스를 선언할 때, 상속받을 부모 클래스의 이름을 extends 뒤에 기술한다. 다만 다중 상속은 불가능 하므로, 부모 클래스명을


2개 이상 기재하는 것은 안된다.


 부모 클래스

핸드폰 

자식 클래스

갤럭시s8, 아이폰x 



자식 객체를 생성할 때는 반드시 부모 객체가 생성되고, 자식 객체가 생성된다.


따라서 내부적으로는 자식 클래스의 생성자에 super() 라는 생성자 메소드가 자동적으로 첨부되게 된다.


이 메소드는 갤럭시s8이라는 클래스의 부모 클래스가 있다면, 핸드폰이라는 부모 클래스의 생성자를 호출하여 그 객체를 자동으로 생성한다.


만일, 명시적으로 부모 클래스의 생성자를 호출하고 싶다면, (ex 부모 클래스의 생성자가 오버로딩이 되어있을 경우) 따로 작성하면 된다.


ex) super("",'',12)


이 super() 생성자 메소드는 언제나 자식 생성자 메소드 내의 첫 줄에 위치하여야 한다! 그렇지 않으면 컴파일시 에러가 발생한다.



메소드 오버라이딩 : 자식 객체에서 부모 클래스의 메소드를 사용하려는데, 메소드의 내용을 수정하고 싶을 수가 있다.


이런 경우를 위해 만들어진 기능이, 메소드 오버라이딩 기능이다.


자식 클래스를 작성할 때, 부모 클래스의 메소드명은 그대로 가져오고, 메소드 내의 내용만 수정한다.


그리고, 자식 객체를 생성해서 메소드를 호출하면 부모 클래스의 메소드는 숨겨지게 되고, 자식 클래스의 메소드가 호출되어 실행이 된다.


만일 부모 클래스의 메소드를 그대로 호출 해야 할 상황이라면, super.메소드명() 으로 호출하면 사용할 수 있다.




final : final 키워드는 상수를 만들 때도 사용하지만, 클래스와 메소드에 붙여서 선언한다면, 상속이 불가능하게 만드는 효과가 있다.


이는 자식 클래스에서 클래스 전체나 일부 메소드의 내용을 변경(오버라이딩) 하여 사용할 수 없게 만드는 것으로, 특정 클래스가 고정된 작


업만 수행하게 하는 역할을 한다. (최종)



protected : 이 접근 제한자가 붙은  필드 , 메소드, 생성자는 오로지 상속받은 클래스에서만 참조할 수 있다.



자동 타입 변환 :  자식 클래스는 부모 클래스의 필드, 생성자, 메소드를 상속 받은 상태이므로, 다시 부모 클래스의 타입으로 변환이 가능하


다. 라고 생각 할 수 있다. 실제로, 자식 클래스의 필드, 생성자, 메소드는 부모 클래스를 참조하고 있다. (비교연산자 == 체크)


그러므로 실제로 이것이 가능한 것이다. 


ex) Phone phone = galaxys8.call();


이 자동 타입 변환은 상속 계층에서 여러번 상속된 상위 클래스로도 이루어 진다. A-B-C로 상속된 관계라면, C는 B나 A 어떤것으로든 타입 변


환이 가능하다.




















while(true) {

if(gas>0) {

System.out.println("달립니다.(gas잔량: " +gas+ ")");

gas -= 1;

}else {

System.out.println("멈춥니다.(gas잔량: " +gas+ ")");

return; //메소드 실행 종료.

}


gas 감소량을 기입하지 않으면, 무한루프를 돌게 된다.




'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 내 log를 마음대로 출력하는 방법  (0) 2018.09.10
캡슐화(Capsulation)  (0) 2018.08.07
다형성 (polymorphism)  (0) 2018.07.20
상속(Inheritance)  (0) 2018.07.20
Return data type에 대한 검색 및 정리.  (30) 2018.05.03


1. 데이터의 리턴 타입을 모를때 확인 하는 방법.



aaa.getAbc()의 return 객체를 모른다고 할때

Object obj = abc.getAbc();
일단 모든 객체는 Object을 상속 받기 때문에 return 값을 Object로 받습니다

System.out.println("return type=" + obj.getClass().getName());
받은 객체가 어떤 객체인지 이름을 찍습니다.




2. JAVA에서는 메모리 주소를 직접 다루는 것이 허용되지 않음.


findViewById();라는 펑션의 Return Type이 View Class인데 , 이 return 값을 받는 쪽은 어째서 Type이 View 혹은 ,, textView 등 View를 상속받은 Data type이어야 하나요? 어차피 주소값이 날라오는거 아닌가요? 그냥 Int나 float이 그 주소값을 받아버리면 안되나요? 주소값이랑 그 주소에 있는 Data의 Type이 어디에 Match되어 저장되어 있는건가요??? 그 Type이라고 하는것은 Data의 크기 그 이상의 의미를 갖고 있는건가요?



자바에서는 메모리 주소를 직접 다루는 것을 허용하지 않습니다. 달리말하면 C/C++처럼 주소를 직접적으로 다루는 인터페이스를 제공하지 않는다라고 이해할 수 있습니다. 따라서 말씀하신 int, float으로 주소값을 받아서 객체를 조작하는 것은 불가능합니다.

자바에서는 객체를 변수에 할당 시 해당 객체에 대한 참조를 갖게 됩니다. 이 참조가 객체를 찾아내는 방식이 C/C++관점에서 보면 포인터와 유사하게 동작한다고 이해할 수는 있겠지만 그렇다고 해서 메모리의 주소값을 다룰 수 있는 것은 아닙니다.

3. 

'프로그래밍 > JAVA' 카테고리의 다른 글

Java에서 내 log를 마음대로 출력하는 방법  (0) 2018.09.10
캡슐화(Capsulation)  (0) 2018.08.07
다형성 (polymorphism)  (0) 2018.07.20
상속(Inheritance)  (0) 2018.07.20
클래스 - 다른 클래스의 메소드 호출  (0) 2018.05.17

+ Recent posts