[JAVA] 생성자 JAVA Constructor
객체지향 언어, 즉 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