java2019. 9. 13. 19:09

 

ex1) Parent의 접근 제어자가 Child와 같을 경우 , 동적바인딩이 발생, 일반적인 케이스

public class TestApplication {
	
	
	public static void main(String [] args) {
			
		TestApplication test = new TestApplication();
		
		
		test.doTest();
		
		
		
	}
	
	private void doTest() {
		 
		A a = new A();
		A b = new B();//B를 A의 reference object로
		
		a.printname(); 
		b.printname(); // BB가 출력됨
		
		
		
	}

	class A{
		public void printname() { //다형성(동적 바인딩) -> B 생성자에 의해 생성되었기 때문에 BB가 호출됨. 
		//private void printname() {
			
			System.out.println("AA");
		}
	}
	
	class B extends A{
		
		public void printname() {
			System.out.println("BB");
		}
		
	}


}

 

 

 

ex2) Parent의 접근 제어자가 Child와 다를 경우 ( prviate -> public) , 정적바인딩이 발생

(정확한 이유는 모르나 signature가 달라져서 그런 것이 아닌가 추측되며, 당연한 소리지만 이경우 명시적 형변환을 통해 Child의 메소드를 호출하는 것이 가능.)

public class TestApplication {
	
	
	public static void main(String [] args) {
			
		TestApplication test = new TestApplication();
		
		
		test.doTest();
		
		
		
	}
	
	private void doTest() {
		 
		A a = new A();
		A b = new B();//B를 A의 reference object로
		
		a.printname(); 
		b.printname(); // AA가 호출 됨. 
		
		
		//해결책
		B b2 = (B)b;   //명시적으로 캐스팅할 경우,
		b.printname(); // BB가 호출 됨. 마치 정적 바인딩 마냥 동작
		
		
	}

	class A{
		//public void printname() { 
		private void printname() {//자식 클래스의 접근제어자가 다르면 signature가 다르기 때문인지(추측) 명시적 형변환이 없다면, 부모의 메소드가 호출됨.
			
			System.out.println("AA");
		}
	}
	
	class B extends A{
		
		public void printname() {
			System.out.println("BB");
		}
		
	}


}

 

출처 : 타이핑하다 우연히 발견

'java' 카테고리의 다른 글

Object class  (0) 2019.09.14
deprecated 된 모듈 빌드 시.  (0) 2019.09.13
오버라이딩  (0) 2019.09.13
참조자료형의 명시적 형변환  (0) 2019.09.13
상속에서 생성자 관련 팁.  (0) 2019.09.13
Posted by easy16
java2019. 9. 13. 18:23

 

메소드 오버라이딩

조건 : 접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 개수가 동일 -> same signature를 갖는다.


Overriding의 의미 : 다른 무엇보다 중요한, 최우선시 되는


접근제어자는 부모 클래스의 메소드와 다를 수 있으나 접근 권한이 확장되는 경우만 허용된다.

ex) 부모에선 private -> 자식에선 public

 

 

static class A{
	
		private void printname() {
			
			System.out.println("AA");
		}
	}
	
	
	static class B extends A{
			B(){
				super();
			}
		public void printname() { // private -> public
			System.out.println("BB");
		}
		
	}	

 

 

출처 : 자바의 신

Posted by easy16
java2019. 9. 13. 18:21

 

1, 자식을 부모의 참조자료형에 저장하면 자동으로 형변환이 일어남.

2, 부모 타입을 자식타입으로 변경하는 경우 아래의 코드와 같이 명시적 형변환을 시켜야한다.

3, instanceof 연산자를 사용할 때는 최하위 자식 -> 부모 순으로 필터링 한다.

 

public class TestApplication {
	
	
	public static void main(String [] args) {
			

		/*
		 * B b = new B();
		 * 
		 * b.printname();
		 */
		
		
		
		objectCastArray();
		
		
	}
	
	public static void objectCastArray() {
		
		A [] objectArray = new A[3];
		
		objectArray[0]= new A();
		objectArray[1]= new B();
		objectArray[2]= new B();
		
		printIfBClass(objectArray);
	}
	
	public static void printIfBClass(A [] objectArray) {
		
		
		
		for ( A a : objectArray) {
			
			if ( a instanceof B) { // instanceof 를 써서 type 체크할 경우, 가장 하위에 있는 자식 타입부터 확인
			//if ( a instanceof A) {  옆에 있는 녀석 처럼 체크하면 a가 A인지 B인지 알 수 없음. B또한 A타입이기 때문.
				B b = (B)a; //명시적 형변환
				b.printname();
			}
		}
		
	}
	
	
	static class A{
	
		private void printname() {
			
			System.out.println("AA");
		}
	}
	
	
	static class B extends A{
			B(){
				super();
			}
		public void printname() {
			System.out.println("BB");
		}
		
	}


}

 

출처 : 자바의 신

Posted by easy16
java2019. 9. 13. 17:44

상속에서 생성자 관련 팁.

1, 자바에선 부모의 매개변수가 없는 기본 생성자를 찾는 것이 기본.
2, 부모클래스에 '매개변수가 있는 생성자만' 있는 경우 super()를 이용하여 부모 클래스의 생성자를 꼭 호출해야한다.
3, 자식클래스의 생성자에서 명시적으로 super()를 지정하지 않으면, 컴파일 시, 자동으로 super()가 추가된다. 
4, super는 반드시 자식클래스의 생성자 맨 첫 줄에 선언 되어야 한다.

 

출처: 자바의 신

'java' 카테고리의 다른 글

오버라이딩  (0) 2019.09.13
참조자료형의 명시적 형변환  (0) 2019.09.13
import 명령어 관련 팁  (0) 2019.09.13
임의 개수 매개 변수, Arbitrary Number of Arguments  (0) 2019.09.12
static 블록의 활용  (0) 2019.09.12
Posted by easy16
java2019. 9. 13. 14:21

 

import 명령어 관련 팁


1, import c.*와 import c.javapackage.sub.* 의 차이

 

기본 개념: import 패키지이름.클래스이름을 명시할 경우, 해당 패키지의 클래스를 사용하겠다는 명시.

전자의 경우, c 디렉토리 안에 선언된 모든 class를 참조 
후자의 경우, c.javapackage.sub이하의 모든 class를 참조.
즉, 전자의 경우 해당 경로의 모든 sub의 class를 참조하지는 않는다.


2, import static (since JDK 5)

 

static한 변수와 메소드 사용할 때 용이.
이름이 중복될 경우, import 된 것 보다 자신의 것이 우선됨.

 

package javapackage;

//import static java.lang.System.out;
import javapackage.sub.Sub;

//1,import javapackage.sub.SubStatic;
//1,import javapackage.sub.*;
//2,import static javapackage.sub.SubStatic.CLASS_NAME;
//2,import static javapackage.sub.SubStatic.subStaticMethod;
import static javapackage.sub.SubStatic.*;

public class Package{

    public static void main (String[] args){

        //1,SubStatic.subStaticMethod();
        subStaticMethod();//2
        //1,System.out.println(SubStatic.CLASS_NAME);
        System.out.println(CLASS_NAME);//2

    }

    public static void subStaticMethod(){
        System.out.println("my subStaticMethod ");//이름이 중복될 경우, import 된 것 보다 자신의 것이 우선됨.
    }
}



 

출처 : 자바의 신

'java' 카테고리의 다른 글

참조자료형의 명시적 형변환  (0) 2019.09.13
상속에서 생성자 관련 팁.  (0) 2019.09.13
임의 개수 매개 변수, Arbitrary Number of Arguments  (0) 2019.09.12
static 블록의 활용  (0) 2019.09.12
반복문에서 label의 사용  (0) 2019.09.12
Posted by easy16
java2019. 9. 12. 18:35

임의 개수 매개변수를 넘길 때 아래와 같이 

int...number 를 사용하면 bb를 호출할 때 처럼 배열을 사용하지 않고 임의의 개수의 매개변수를 받을 수 있다.

 

public class TestApplication {
	
	
	public static void main(String [] args) {

		aa(1,2,3,4,5);
		bb(new int[] {1,2,3,4,5});
			
	}
	
	
	static void aa(int...number) {
		
		int sum=0;
		for (int i : number) {
			sum += i;
		}
		System.out.println("sum : "+ sum);
	}

	static void bb(int []number) {	
		
		int sum=0;
		for (int i : number) {
			sum += i;
		}
		System.out.println("sum : "+ sum);
	}

}
	

 

 

 

출처 : 자바의 신

'java' 카테고리의 다른 글

상속에서 생성자 관련 팁.  (0) 2019.09.13
import 명령어 관련 팁  (0) 2019.09.13
static 블록의 활용  (0) 2019.09.12
반복문에서 label의 사용  (0) 2019.09.12
hashcode 및 equals를 같이 override 하는 이유  (0) 2018.09.06
Posted by easy16
java2019. 9. 12. 18:16

 

 

static 블록은 객체가 생성되거나, 클래스 참조가 발생하는 경우 한번 호출 된다.

(static 메소드 또는 static변수 참조)

 

초기화 블럭(initialization block)


1, 클래스 초기화 블럭 : 클래스 변수의 복잡한 초기화에 사용된다. 클래스가 처음 로딩될 때 한번만 수행된다.
2,  인스턴스 초기화 블럭 : 인스턴스 변수의 복잡한 초기화에 사용된다. 인스턴스가 생성될때 마다 수행된다.

 ( 생성자보다 먼저 수행된다. )

인스턴스 변수의 초기화는 주로 생성자를 사용하기 때문에, 인스턴스 초기화 블럭은 잘 사용되지 않는다. 

 대신 클래스의 모든 생성자에서 공통적으로 수행되어져야 하는 코드가 있는 경우 생성자에 넣지 않고 인스턴스 초기화 블럭에 넣어 두면 코드의 중복을 줄일 수 있어서 좋다.
class InitBlock{
    static {
        /* 클래스 초기화 블럭 */
    }

    {   /* 인스턴스 초기화 블럭 */ }

 

 

클래스 내에서만 선언 가능.

 

딱히 분리할 이유는 없지만 아래와 같이 분리된 경우, 선언된 순서로 호출되므로 주의.


import static java.lang.System.out;

public class TestApplication {
	
	
	public static void main(String [] args) {
			
		Human h1 = new Human();
		Human h2 = new Human();
		
	}

}


class Human {

	static int count=98127391;//임의의 값으로 초기화
	static {
		System.out.println("static block called 111");
		count=0;//0으로 초기화
		Hello();
		
	}
	static {
		System.out.println("static block called 222");
		count=0;//0으로 초기화
		Hello();
		
	}
	public Human(){
		count ++;
		System.out.println("human : "+count);	
	}
	
	
	private static void Hello() {
		System.out.println("hello!!!");
	}
}

	

출처 : 자바의 신

Posted by easy16
java2019. 9. 12. 15:29

 

아래와 같이 continue 뒤에 label을 설정하면 

다중 반복 루프에서 원하는 반복문으로 이동이 가능하다.

나중에 훌륭하게 써먹자.

 

구구단에서 4단을 건너 뛰는 예제.

		startLabel:
        for ( int i = 2 ; i <= 9 ; ++i ){

            for( int j = 1 ; j <= 9 ; ++j ) {
                if( i == 4 ) continue startLabel;
                if( j == 3 ) break;
                System.out.print( i +"*" + j +" = " +i*j +" " );

            }
            System.out.println();
        }

 

 

 

출처 : 자바의 신

'java' 카테고리의 다른 글

임의 개수 매개 변수, Arbitrary Number of Arguments  (0) 2019.09.12
static 블록의 활용  (0) 2019.09.12
hashcode 및 equals를 같이 override 하는 이유  (0) 2018.09.06
Cloneable interface (LINK)  (0) 2018.07.18
접근 지정자  (0) 2018.07.18
Posted by easy16
java2018. 9. 6. 14:14

출처 : 

https://hashcode.co.kr/questions/1069/hashcode%EB%A9%94%EC%86%8C%EB%93%9C%EB%A5%BC-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0

'java' 카테고리의 다른 글

static 블록의 활용  (0) 2019.09.12
반복문에서 label의 사용  (0) 2019.09.12
Cloneable interface (LINK)  (0) 2018.07.18
접근 지정자  (0) 2018.07.18
Simple reflection examples.  (0) 2018.07.09
Posted by easy16
java2018. 7. 18. 18:53

참조:

http://javacan.tistory.com/entry/31

'java' 카테고리의 다른 글

반복문에서 label의 사용  (0) 2019.09.12
hashcode 및 equals를 같이 override 하는 이유  (0) 2018.09.06
접근 지정자  (0) 2018.07.18
Simple reflection examples.  (0) 2018.07.09
install openjdk-8-jdk on unbuntu  (0) 2018.06.22
Posted by easy16