ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 생성자 JAVA Constructor
    Programming/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

     

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

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

    aljjabaegi.tistory.com

     

    'Programming > JAVA' 카테고리의 다른 글

    [JAVA] 엑셀 (excel) 파일 read 하는 법 (.xls, .xlsx)  (0) 2019.12.04
    [JAVA] 페이징 처리  (1) 2019.11.25
    [JAVA] Exception 처리  (0) 2019.11.19
Designed by Tistory.