Programming/JAVA

[JAVA] 생성자 JAVA Constructor

100winone 2019. 11. 29. 11:13

객체지향 언어, 즉 JAVA에서 인스턴스를 초기화할 때 사용하는 것을 생성자라고 한다.

즉 메모리에 생성된 클래스에 대한 정의를 하는 것이라고 할 수 있다.

 

생성자의 특징으로는

 

1. 반환값이 없다

2. 생성자의 이름은 클래스의 이름과 동일하다

3. 생성자는 매개변수에 따라 여러개를 만들 수 있다

 

public class HeaderVO {
	private String model;
	private String carNum;
	private String carType;
	private String carRegNo;
	private String regNo;
	private String driverCd;
}

이렇게 기본 클래스에 변수만 선언하더라도, 다른 클래스에서 import만 해주면 생성자를 따로 미리 만들어 놓지않아도 기본 생성자가 있다. 이 경우에는 HeaderVO header = new HeaderVO() 처럼  하나의 생성자도 없을 경우 자동으로 생성자를 하나 생성해주기 때문이다.

 

생성자 생성은 Alt+Shift+S 후에 O를 누르면 생성이 가능하다.

public class HeaderVO {
	private String model;
	private String carNum;
	private String carType;
	private String carRegNo;
	private String regNo;
	private String driverCd;
	
	public HeaderVO(String model, String carNum, String carType, String carRegNo, String regNo, String driverCd) {
		super();
		this.model = model;
		this.carNum = carNum;
		this.carType = carType;
		this.carRegNo = carRegNo;
		this.regNo = regNo;
		this.driverCd = driverCd;
	}

기본 생성자 생성을 통해 생성하게 되면 이런 코드들이 generate 된다.

 

생성자는 메소드 오버로딩이 가능해서 파라미터의 갯수를 몇개 주느냐에 따라도 설정할 수 있다!

public class HeaderVO {
	private String model;
	private String carNum;
	private String carType;
	private String carRegNo;
	private String regNo;
	private String driverCd;
	
	public HeaderVO(String carRegNo, String regNo, String driverCd) {
		super();
		this.carRegNo = carRegNo;
		this.regNo = regNo;
		this.driverCd = driverCd;
	}
	public HeaderVO(String carNum, String regNo) {
		super();
		this.carNum = carNum;
		this.regNo = regNo;
	}
}

이런식으로 말이다!

 

또한 구조체 형식으로 main에서 가장 상단에 있는 클래스만 import하면 하위 클래스들 까지도 접근 가능하다.

 

Result(VO는 생략했습니다) 가 가장 상단에 있고 그 아래를 계속 참조하는 이런 구조체 형식의 클래스들이 있다고 보자.

ResultVO 클래스 내부에는 ResultSetVO 를 선언하고 생성하는 생성자를 만들어 보겠다.

ResultSetVO 클래스 내부에는 HeaderVO와 BodyVO를 선언하고 생성자를 만들고 Main Controller에서 어떤식으로 접근 가능한 지를 한번 보겠다.

 

 

 

 

 

 

 

// ResultVO 코드

public class ResultVO {
	private ResultSetVO result;

	public ResultVO() {
		super();
		this.result = new ResultSetVO();
	}
}
// ResultSetVO

public class ResultSetVO {
	private HeaderVO header;
	private List<BodyVO> body;
	
	public ResultSetVO() {
		super();
		this.header = new HeaderVO();
		this.body = new ArrayList<BodyVO>();
	}
}

이런식으로 상위 구조체에서 아래로 생성자를 생성해주고 Main에서 어떤방식으로 사용하는지 한번 보자

 

public class ProController {
	private static final Logger LOGGER = LoggerFactory.getLogger(ProController.class); 
	
	@Autowired
	ProService proService;
	
	@GetMapping("/read")
	public String getFile() throws Exception{
		ResultVO res = new ResultVO(); // 최상위인 ResultVO 생성
		String checkStr = null;
		int cnt = 0;
		int once = 0;
		int errorCnt = 0;
		try {
			
			try {
				checkStr = proService.getFile();
			} catch (Exception e) {
				LOGGER.error("파일을 읽는데 실패 하였습니다.", e);
				throw e;
			}
			System.out.println(checkStr.length());
			try { 
				res.getResult().getHeader().setModel(checkStr.substring(0, 20)); // 여기서 res로 아래 코드들에 접근가능 
				res.getResult().getHeader().setCarNum(checkStr.substring(20, 37));
				res.getResult().getHeader().setCarType(checkStr.substring(37, 39));
				res.getResult().getHeader().setCarRegNo(checkStr.substring(39, 45));
				res.getResult().getHeader().setRegNo(checkStr.substring(45, 55));
				res.getResult().getHeader().setDriverCd(checkStr.substring(55, 73));
				checkStr = checkStr.substring(73);
				res.getResult().setHeader(res.getResult().getHeader());	
			}catch(Exception e) {
				LOGGER.error("헤더 데이터 파싱에 에러가 발생했습니다.", e);
				throw e;
			}

위처럼 ResultVO res = new ResultVO() 로 생성해주면 생성자 내부에서 이미 ResultSetVO를 생성했기 때문에 접근 가능하고 ResultSetVO에서도 HeaderVO와 BodyVO를 생성했기 때문에 res.getResult().getHeader().setModel(checkStr.substring(0, 20)); 이런방식으로 접근과 수정이 가능하다.!!

 

이 글이 무쪼록 도움이 되길 바라며.. 나에게도 성장이 계속되기를 ...바란다...ㅎ!ㅋ!

 

출처 : https://aljjabaegi.tistory.com/408

 

Java Constructor 자바 생성자 이 것만 보면 이해 끝

Java Constructor 자바 생성자 이 것만 보면 이해 끝 이번 포스팅의 주제는 생성자(Constructor) 입니다. 대부분의 책에서는 '인스턴스를 초기화 하는 메서드이다' 와 비슷하게 생성자를 정의하는데요. 위의 설명..

aljjabaegi.tistory.com