-
[JAVA] 생성자 JAVA ConstructorProgramming/JAVA 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
'Programming > JAVA' 카테고리의 다른 글
[JAVA] 엑셀 (excel) 파일 read 하는 법 (.xls, .xlsx) (0) 2019.12.04 [JAVA] 페이징 처리 (1) 2019.11.25 [JAVA] Exception 처리 (0) 2019.11.19