블로그 이미지
인간은 자신이 이해하지 못하는 것을 경멸하는 버릇이 있다. 셜병장

카테고리

분류 전체보기 (37)
주절주절 (1)
누리다 (1)
생활의 발견 (0)
Memory (1)
내 몸의 물 (8)
Developments (14)
Attraction (9)
Father Time (2)
Play Ground (1)
Total
Today
Yesterday

기본적으로 Java 컴파일러는 클래스를 생성할때 생성자가 없으면 첫줄에서 자동으로 생성해준다.

이때 매개변수가 없는 생성자는 별문제없으나 매개변수가 있는 생성자만 존재한다면

하위 클래스 ..즉, 서브클래스에서 상속받을시 문제가 발생할 수 있다.


EX) 

에러메시지는 아래와 같다..

Error Msg : Implicit super constructor test06.Machine() is undefined. Must explicitly invoke another constructor


그에 상응하는 예제..

public class test06 {

	class Machine{

		String name = "machine";

		public Machine(String nm){

			name = nm;

		}

	}

	

	public class Tank extends Machine{

		String model = "0000";		

		public Tank(String id){

			model = id;

		}

	}

	

	public void main(String[] args){

		Tank t = new Tank("4231");

		System.out.println(t.model);

	}

}


컴파일시 생성자의 첫번째 명령문이 super 클래스의 생성자 호출문이 아니면 자동으로 해당 위치에 매개변수가 없는 호출문을 추가한다. 위에서는 super 클래스에 매개변수가 없는 생성자가 없기때문에 컴파일 에러가 발생하는 것이다.


해결 방법)

1. Super 클래스에 매개변수가 없는 생성자를 추가

	class Machine{

		String name = "machine";

		public Machine(){}	⁄⁄첫번째 해결 방법

		public Machine(String nm){

			name = nm;

		}

	}


2. 서브 클래스의 생성자 안에 슈퍼 클래스의 생성자를 호출

	public class Tank extends Machine{

		String model = "0000";		

		public Tank(String id){

			super("Tank");	⁄⁄두번째 해결 방법

			model = id;

		}

	}


자바 컴파일러는 서브클래스의 생성자 안에 슈퍼클래스의 생성자 호출문이 있으면 매개변수가 없는 생성자를 추가로 호출하지 않는다.

이때 super 호출문은 생성자 제일 위애 존재하여야 한다!!!


Posted by 셜병장
, |

argument에 가변적으로 변할수 있는 일종의 list를 받아올수 있도록 할수 있다.

예로 String뒤에 "..." "점점점" 세개를 붙이면 argument로 가변적적인 string 갯수를 가져올수 있다.


public void test(String... str){

	for(int i=0;i<str.length;i++){

		System.out.print(str[i]+" ");

	}	

}


주의 할점 : 

1. 해당 Method를 오버라이딩시 정상적으로 동작하지 않을수 있다.

가변적인 인자에 대한 값이 오버라이딩시 문제 발생

2. 인자 값을 "String... str"외에 "int x"등을 추가할시 반드시 가변인자 값을 맨 뒤에 써야한다.


아래와 같은 상황은 Error 발생 int와 String 위치를 바꿔줘야함

public void test(String... y, int x){

	⁄* source code*⁄

}



Posted by 셜병장
, |

[Java] synchronized

Developments/Java / 2013. 7. 13. 11:47

멀티스레드에서 여러 스레드가 객체의 상태에 손상을 줄수 있으므로 해당 객체에 대한 접근을 제한하는...동시에 실행되어서는 안되는 critical section에 보호하기 위해 synchronized 를 사용한다.

A 쓰레드에서 작업하던 도중 B 쓰레드에게 제어권이 넘어갔을 때, A쓰레드가 작업중이던 공유데이터를 B쓰레드가 임의로 변경한다면 A쓰레드에게 제어권이 넘어갔을때 해당 공유데이터의 작업시 다른 결과가 나오는 문제가 발생할수 있다. 

이를 방지하기 위한 일정의 Lock ... 즉, 접근 방지이다.!!


하나의 스레드만이 데이터 구조에 접근하는 방식이라면 굳이 해당 방식을 사용하지 않아도 된다.


//객체에 Lock을 걸때

synchronized(객체의 참조변수){
	//Source Code...
}


//메서드에 Lock을 걸때

public synchronized void lockTest(){
	//Source Code...
}


Posted by 셜병장
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함