부트캠프수업정리

1주차 정리(1/3~1/7)

파뱁 2022. 1. 7. 23:03
728x90

첫 날은 자바 환경 정리와 기본적인 자바 언어를 학습했다.

약 2년전에 학부 수업에서 배운 적은 있었지만, 또 기초 부터 다루니 새로운 느낌이 들었다.

자바라는 언어의 기본 구성에 대해 다뤘는데 내용을 간략하게 정리하자면 다음과 같다.

 

* 자바 소스 구조

package 선언구
import 선언구
class 이름{
	변수(데이터)
	생성자
	메소드(기능)
}

 

* 반드시 클래스 내부에 구현해야만 하는 요소들

 

 1. 변수 선언 및 호출
   - 데이터
   - 타입 변수 명;
   - 타입 변수명 = 값;


 2. 생성자 구현 및 호출
   - 클래스명과 동일, (){}
   - 용도 : 객체 생성
     - new 라는 객체 생성 키워드
     - 객체 생성 문법
         new 생성자([값]);
     - 클래스가 보유한 메소드 호출의 첫 단계는 객체 생성후 참조 변수로 메소드 호출


 3. 메소드 구현 및 호출
   - 객체 생성시에 호출되는 생성자와 다름
   - 반환타입 메소드명([arguments]){[logic]}


둘째날은 자바의 객체 개념에 대해 더 자세히 배웠다.

 

getter, setter 구분은 다음과 같다.

1. 이름정보 주세요
  - 새로운 제공 없이 존재 하는 데이터값만 요청
  - argument 불필요/return 필요
   String getName(){
       return 이름 값;
   }
 2. 개명했으니 이름 수정해주세요
  - 새로운 데이터 줄테니 이 정보로 변경
  - argument 필수
   void setName(String newName){
       이름값 수정;
   }

 

데이터 타입에 대한 설명은 다음과 같다.

  1. 데이터 타입 학습
  2. 데이터 타입이 활용이 되는 문법적인 위치
   1. 멤버, 로컬 변수 선언시 타입
     - 로컬 : 생성자, 메소드 argument와 {} 내부에 선언
   2. 리턴 타입
  3. 데이터 타입 종류
   1. 기본 타입(내장 타입, built in 타입)
     총 8가지 만 있음
     클래스가 미 존재한 상태로 소문자로 키워드로 타입이 이미 정해져 있음
     형태별로 구분
       문자형/논리형/실수형/정수형
     형태별로 사이즈로도 세분화
       1. 문자형 - char, 16bit(다국어 지원 사이즈)
       2. 논리형 - boolean(true or false)
       3. 실수형 - float, 32bit/double, 64bit
       4. 정수형 - byte, 8bit / short, 16bit / int, 32bit / long, 64bit
   2. 객체 타입(참조 타입, class 타입)
     기본이 아닌 모든 타입 의미
     클래스를 기반으로 타입 생성
     API 즉 이미 만들어서 개발자들에게 사용하라 제공하는 라이브러리에 다수에 클래스, 즉 타입 존재
     문자열은 String.java로 제공되는 클래스, 사용 빈도가 높아서 기본 타입처럼 문법을 제시
     객체 생성 문법
       타입 변수 = new 생성자([..]);
       String 변수 = new String([문자열]);
       String 변수 = ""; -> 이 표기도 허용, 자동으로 String 객체 생성됨
     생성된 객체가 실제 저장되는 메모리 - heap
       heap 메모리 특징
         객체만 저장
           생성되는 객체는 보유한 모든 맴버 변수들 공간을 생성 관리
           객체들 메모리 회수는 garbage collector(GC)

 

변수와 메소드 호출 방식은 두 가지가 있고 이는 다음과 같다.

1. 일반 변수와 메소드 호출 방식
   무조건 객체 생성 직후 참조 변수로 호출
2. static 키워드로 선언된 변수와 메소드 호출 방식
   객체 생성과 무관하게 호출
   참조 변수 없이 호출

객체의 필요성
  데이터가 중요한 표현은 객체 생성 필수
  단순하게 메소드만 호출하기 위해 객체 생성은 큰 의미가 없음(클래스 보다 메소드의 기능 자체가 중요한 경우)
  불필요한 객체는 생성 안하는 게 기본

 

static키워드에 대한 학습도 진행했다.

1. static 키워드 학습
2. static 키워드 활용 영역
   1. 멤버 변수에 선언  - static 타입 변수;
       호출 문법
           - class명.변수명 = 외부 클래스의 변수 호출시 사용되는 문법
           - 변수명 = 동일한 클래스 내의 static 변수 호출 문법
           - 생성된 객체의 참조 변수.변수명 = 어차피 생성되는 모든 객체가 공유
       다수가 공유하는 공지사항 등은 공유 권장 static으로 처리
       반대로 공유하면 안되는 건 static으로 처리하면 안됨
   2. 메소드에 선언      - static 리턴타입 메소드 명(){}
        호출 방법
           - 외부 클래스에서 호출 시
                클래스명.메소드명();
           - 동일한 클래스에서 호출시
                클래스명.메소드명();
                메소드명();
                참조변수명.메소드명();
   3. static{}
       바이트 코드가 메모리에 로딩시에 자동 실행
       main() 보다 우선 실행 보장
       다수 유저들이 사용하는 공유자원 한번만 설정(초기화)시에 권장

3. JVM 메모리
   1. class 또는 method - byte code가 저장되는 영역, static으로 선언된 변수 공간 생성
   2. stack - 로컬 변수들 저장 공간
   3. heap - 객체들만 저장

4. static 변수 특징

    멤버 변수들은 객체 생성 시점에 자동으로 기본 값으로 초기화

    실수 = 0.0, 정수 = 0, boolean = false, char = '\u0000' 값이 없다는 널 의미

    모든 참조 타입 = null

    인스턴스 변수와 다르게 인스턴스를 필요로 하지 않음

    stack이나 heap에 가기 전에 class나 method 메모리에 사용가능하게 실제 메모리 생성

    따라서 객체 생성과 무관하게 사용가능한 데이터들 표현시 적합

 

API 응용도 간단히 다루었다.

1. API 응용
   - Application Programming Interface
   - 이미 구현되서 사용 가능하게 제공해주는 코드들
       클래스.변수.생성자.메소드
   - library

2. tip 함축 표현
   - src : source
   - lib : library
   - bin : binary
3. API 활용 문법
   - 변수/생성자/메소드 호출 문법
   - 호출문법
        1. 객체 생성 직후에 호춯
            - 인스턴스 변수와 인스턴스 메소드
        2. 객체 생성없이 호출
            - static 변수와 static 메소드
   - 외부 package 사용 문법
        import package명.class명;
        java.lang 패키지만 유일하게 import 생략 가능


3일차에는 자바에서 자주 쓰이는 라이브러리에 대한 공부를 했다.

 

여기서는 lombok, log4j, juint을 다룰 것이다.

- lombok은 코드량 감소해서 개발 가능한 라이브러리
  개발 시간 단축, 수정 용이
   
- log4j는 앤드 유저들의 사용 기록을 쉽게 기록할 수 있는 라이브러리
  로그 기록용 라이브러리
   
- junit은 개발 하는 기능들을 실시간 확인 가능한 단위 테스트용 프레임워크
  main() 불필요
           웹서비스에는 main()이 불필요
           main()는 서버 없이 실행시켜야 하는 자바 소스들이 있을때
       주로 test시에 사용
       현 추세 main() 말고 junit가 실무형 테스트 방식
- 환경 세팅 시 주의 사항
   maven 통해서 라이브러리 통해서 다운로드
   build path 추가

 

패턴에 대한 공부도 진행했다.

프로그램 개발시 권장하는 구조는 다음과 같다.

1. Data Transfer Object [DTO] pattern
   여러 클래스 간에 주고 받는 데이터용 객체를 의미
   Value Object[VO] pattern

   데이터로 하는 것은 다음 4가지가 보편적이다. "CRUD (Create Read Update Delete)"

2. MVC pattern
   Model - 핵심 기능
   View - 화면 담당 기능
   Controller - 요청 받고 해당 요청별 실제 biz 로직 실행, view 지정

 

이를 바탕으로 실습한 코드의 구조는 다음과 같다.

1. model.Customer.java
   DTO
   데이터 표현용 클래스
   CustomerDTO.java CustomerVO.java Customer.java CustomerBean.java ...
2. controller.Controller.java
   요청 수락 후에 핵심 로직 실행 후 화면처리 로직 지정(실행)
3. view.StartView.java
   시작화면 가정
   main() 보유
   브라우저 화면이라 가정해서 클라이언트가 요청동작 시작이라 가정
       컨트롤러가 고객 정보 요청으로 실습
4. view.EndView.java
   결과값만 출력하는 기능
5. model.Model.java
    DTO 생성하는 클래스
    실제 데이터를 db로 부터 검색해서 DTO 객체 생성하고 컨트롤러에게 응답(반환) 해주는 기능
 * 참고 : 스타트와 엔드 뷰는 웹으로 업데이트 시에 브라우저에서 실행되는 코드로 변환 예정

 

코드 예제

<StartView.java>

package view;

import controller.Controller;

public class StartView {
	// 시작하는 뷰의 클래스, 추후에 뷰는 End User에게 실제로 보이는 뷰로 대체 할 수 있다.
	public static void main(String[] args) {
		// Model 클래스에 요청을 보낼 수 있는 Controller 클래스에 요청을 보내는 메소드를 호출한다.
		// 테스트를 위해 메인 메소드를 이용했다.
		Controller.reqRes();
	}

}

<CustomerDTO.java>

package model;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class CustomerDTO {
	//고객의 정보를 담고 있는 데이터 클래스
	//데이터는 중요하기 때문에 접근을 제한하기 위해 private를 사용하여 동일 클래스 내에서만 사용가능하게 하고,
	//실제 이 데이터를 쓰기 위해선 getter, setter을 이용하도록 구성하였다.
	private String id;
	private int pw;
	private char grade; // g(gold), s(silver) 두 레벨만 가능하다고 가정
	private String job;
	
	//grade값에 유효한 값만 저장 가능한 조건식 적용, 어노테이션이 있지만 사용자 정의로 재정의 할 수 있음
	public void setGrade(char grade) {
		//유효성 검증 코드 (가능한 두 가지의 레벨일 경우만 grade에 값을 넣음)
		if((grade == 'g')||(grade =='s')) {
			this.grade = grade;
		}
		else {
			System.out.println("무효한 등급");
		}
		
	}
}

<Model.java>

package model;

public class Model {
	//데이터 클래스를 가져와서 CRUD 하는 작업 등을 수행하는 클래스
	//우선 이 파일에서는 이 중 일부만 수행했다.
	public static CustomerDTO getCustomer() { //Model 객체는 안 만들어도 되서 여기서는 static으로 해도 됨
		//실제 데이터를 세팅하는 부분
		CustomerDTO c = new CustomerDTO();
		//위 부분까지 하면 기본 값이 들어가는 객체를 생성하는 것인데, 아래 코드를 작성하면 실제로 데이터 혹은 데이터의 주소값이 들어감 
		c.setId("encore");
		c.setPw(11);
		c.setGrade('g');
		
		return c;
	}
}

<Controller.java>

package controller;

import model.CustomerDTO;
import model.Model;
import view.EndView;

public class Controller {
	//Model 클래스에서 설정한 데이터를 받아와 EndView로 넘겨주는 클래스
	public static void reqRes() {
		//시작 뷰에서 요청을 할 때 사용하는 메소드
		//아래의 Model.getCustomer(); 부분을 통해 Model 클래스에서 설정한 데이터를 받아온다.
		CustomerDTO c = Model.getCustomer();//모델 클래스의 getCustomer()에서 리턴 받은 Customer객체를 변수로 저장
		EndView.print(c);//저장한 객체를 EndView로 넘김
	}
}

<EndView.java>

package view;

import model.CustomerDTO;

public class EndView {
	//컨트롤러에서 넘겨받은 Customer 객체를 화면에 출력하는 클래스
	public static void print(CustomerDTO c) {
		//인자로 Customer 객체를 받고 이 객체의 Id와 Grade 값을 출력하는 메소드
		System.out.println(c.getId() + " " + c.getGrade());
	}

}

4일차에는 배열 구조, 조건문, 반복문의 학습과 MVC 패턴 복습을 진행했다.

 

배열구조에 대한 설명은 다음과 같다.

- 배열도  String과 마찬가지로 new 없이도 객체 생성이 가능하다.

    (단, 선언, 생성, 초기화 동시 개발시)

- 선언 생성 초기화를 분리해서 개발할 시에는 다음과 같은 코드로 개발한다.

    선언 : 타입 [] 변수명;

    생성 : 변수명 = new 타입[메모리수];

    초기화 : 변수명[인덱스값] = 값;

- 배열의 타입 역시 기본 타입과 객체 타입 모두 가능하다. (int[], Person[] 등등이 가능)

 

조건문에 대한 설명은 다음과 같다.

- 기본 구조 : 

if(조건문a){
	조건이 맞는 경우
}
else if(조건문b){
	조건문 a가 거짓이면서 조건문 b가 참인 경우
}
else{
	모두 거짓일 경우
}

여기서 else if와 else는 필수가 아니다.

 

반복문에 대한 설명은 다음과 같다.

- for문 : 반복횟수가 나름의 제한이 있을 경우 권장

for(초기값;조건식;증감식){
	true인 경우만 실행
}

- while문 : 무한 반복시 or 반복횟수가 불명확할 경우 권장

초기값;
while(조건식){
	true인 경우만 실행
    증감식;
}

- do while문 : 무조건 한번은 해당 식을 실행시키고 이후에 조건을 달고 싶을 때 사용

초기값;
do{
	true일 경우 실행하는 코드(한번은 무조건 실행)
    증감식;
}
while(조건식);

- for each 문 : 배열 안의 값을 바로 가져다 쓰는 경우에 권장(for 문 사용시 생기는 불필요한 초기값 변수를 줄일 수 있음)

for(배열의 원소를 담을 변수 : 배열){
	반복할 코드;
}

 

for each 문에서는 '배열 안에 있는' 자체가 하나의 조건이 되기 때문에 별도의 조건식을 지정하지 않음

 

MVC 패턴의 복습으로 간단하게 만든 코드 예제 (3일차의 코드 구조 참고)

<StudentDTO.java>

package model;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class StudentDTO {
	private String name;
	private int age;
	private int score;
}

<Model.java>

package model;

public class Model {

	public static StudentDTO[] getStudents() {
		StudentDTO[] s = {new StudentDTO("AA", 20, 80),
				new StudentDTO("BB", 20, 50),
				new StudentDTO("CC", 22, 65),
				new StudentDTO("DD", 21, 90),
				new StudentDTO("EE", 23, 65)};
		return s;
	}

}

<StartView.java>

package view;

import controller.Controller;

public class StartView {

	public static void main(String[] args) {
		Controller.reqRes();
	}

}

<Controller.java>

package controller;

import model.Model;
import model.StudentDTO;
import view.EndView;

public class Controller {

	public static void reqRes() {
		StudentDTO[] students = Model.getStudents();
		int max = 0;
		String maxName = "";
		for(StudentDTO s : students) {
			if(s.getScore()>max) {
				max = s.getScore();
				maxName = s.getName();
			}
		}
		EndView.print(maxName);
	}

}

<EndView.java>

package view;

import model.CustomerDTO;

public class EndView {
	//컨트롤러에서 넘겨받은 Customer 객체를 화면에 출력하는 클래스
	public static void print(CustomerDTO c) {
		//인자로 Customer 객체를 받고 이 객체의 Id와 Grade 값을 출력하는 메소드
		System.out.println(c.getId() + " " + c.getGrade());
	}
	public static void printAll(CustomerDTO[] all) {
		for(CustomerDTO v : all) {
			System.out.println(v); //v.toString()
		}
	}
	public static void printMsg(String msg) {
		System.out.println(msg);
		
	}
	

}

어느덧 1주차의 마지막 날이다.

오늘은 예외 처리, 상속과 다형성등에 대해 학습했다.

 

먼저 예외 처리에 대한 설명이다.

 

예외란?
   1. 처리 가능한 경미한 에러
   2. 필요성
       - 절대 이슈가 생겨도 프로그램 실행을 멈춰선 안된다.
       - 문제 발생시 유연하게 처리하고 다른 코드 정상 실행 유지
   3. 예외 처리 문법
       - exception handling 문법
       1단계 try~catch
       - try{
           실로직
           단 문제(예외)가 발생 할수도 안 할수도 있는 로직
       }catch(발생된 예외타입 변수명){
           발생된 경우 처리하는 블록
       }
       2단계 try(1)~catch(1~*)~finally(0 or 1)
       - try{
           실로직
           단 문제(예외)가 발생 할수도 안 할수도 있는 로직
       }catch(발생된 예외타입 변수명){
           발생된 경우 처리하는 블록
       }finally{
           예외 발생 여부와 무관하게 무조건 실행되는 블럭
       }
       3단계 API에서 제공되는 일부 메소드들 처럼 사용자 정의 메소드 body에서도 상황에 따라 예외 객체자체를

           생성해서 호출한 곳으로 위임
           new 예외 객체 생성 / throws로 메소드 선언구에서 던짐
           Class.forName()처럼 예외 던지면 호출한 우리 코드에서 try~catch 처리한 것 처럼
           사용자가 생성한 예외 객체도 호출한 코드에서 try~catch 처리
       4단계 Exception 클래스를 직접 개발
           사용자 정의 예외 클래스도 많음
           Spring 등에도 엄청 다수로 제공
           가령 id 중복된 경우 id중복예외.java 라는 이름으로 예외 클래스 개발

 

예외 종류
   - 컴파일 예외
       예외처리 문법이 필수
       미 처리시 컴파일 자체가 불가
       예 : 로딩하도자 하는 바이트 코드가 없을 수도 있는 큰 이슈인 ClassNotFoundException는 컴파일 예외
   - 실행 예외
       컴파일 무조건 Ok
       실행시 발생
       부모 클래스 중에 java.lang.RuntimeException
       해결책 : 값을 수정 / try~catch로도 처리는 가능
       예 : 배열의 범의에 어긋나는 로직은 배열의 인덱스 표현 즉 실행 예외

 

throw 관련 설명

    throws - body에서 발생 될 수도 있는 예외를 호출한 곳으로 던지기 위해 메소드 선언구에 쓰이는 키워드
    throw - 메소드 body 부분에서 실제 상황상 예외를 생성해서 던지는 키워드(new 하고만 붙음)
    throw가 있으면 throws 가 꼭 붙어야 함
    !!던지면 꼭 catch 해야 함!! (함수 호출한 부분에서)

 

다음은 상속과 다형성에 대한 설명이다.

 

상속

  extends가 없는 클래스들은 무조건 extends Object 코드 자동 적용

  생성자 없는 클래스는 컴파일 시점에 기본 생성자 자동 생성

  println() 참조변수 출력시 자동으로 toString() 호출

  1. 조상(부모 클래스) : 하위(자식) 클래스 관계

      - 상속시에 멤버변수와 메소드들은 하위 클래스에 상속

      - 장점

          복사 붙여넣기가 아니라 코드 자체를 공유

          개발 속도 향상, 기업 관점에서는 비용 절감

      - 참고

          class 내부이 구성요소 : 멤버변수, 생성자, 메소드, static{} 중에서 변수와 메소드만 상속

      - 단, 메소드 로직 수정(재정의, overriding, override)

          java.lang.Object root의 보유 메소드는 11개, 모든 클래스는 이 클래스의 자식이며, 11개를 상속

  2. 상속 문법

      class 자식클래스명 extends 부모클래스명{

          상속받는 변수와 메소드

              재정의, @Override 라는 어노테이션 사용가능(표기가 필수는 아님)

          새롭게 선언하는 변수와 메소드

      }

  3. 자식 객체 생성시

      데이터를 공우(변수 상속)하는 부모 클래스 존재

      변수를 상속받은 자식 클래스

      변수가 사용가능 하게 메모리에 생성 == 객체 생성

      Child 객체 생성시 상속받은 변수들도 메모리에 생성

      Child 객체 생성 요청시 Parent 객체도 생성되어야 함

      Object -> Parent -> Child 순으로 객체 생성

 

다형성

  1. 많은 타입의 형태를 보유할 수 있는 메커니즘

  2. 전제조건

      - 상속관계상에서만 다형성 적용

  3. 예시

      int i = "2"; 불가

      String s = 2; 불가

      String s = new Person(); 불가(상속 관계가 아니어서 안됨)

      상속 관계

      상위 타입 변수 = 자식 객체

          Parent p = new Child();

  4. 형변환

      - 필요성

          코드의 재사용성 강화

          상위타입의 변수는 절대 하위 타입의 멤버들 호출 불가

          API 상에는 이미 재사용성을 도려해서 Object 타입을 파라미터 또는 반환 타입으로 무수히 많이 사용됨

      - 문법

          다운 캐스팅(명시적으로 코드로 형변환) : 하위타입 변수 = (하위타입)상위타입변수;

          업 캐스팅(자동 형변환) : 상위타입 변수 = 자식타입;

 

키워드

  1. this - 자신 객체를 탐조하는 키워드

      this. - 객체 내의 멤버들 호출

      this([..]) - 동일한 클래스의 파라미터가 일치하는 다른 생성자 호출 메소드

  2. super - 부모를 의미하는 키워드

      super. - 부모의 멤버들 호출

      super([..]) - 부모 클래스의 파라미터가 일치하는 생성자 호출 메소드

728x90
반응형

'부트캠프수업정리' 카테고리의 다른 글

6주차 정리(2/7~2/11)  (0) 2022.02.14
5주차 정리(2/3~2/4)  (0) 2022.02.04
4주차 정리(1/24~1/28)  (0) 2022.01.28
3주차 정리(1/17~1/21)  (0) 2022.01.21
2주차 정리(1/11~1/14)  (0) 2022.01.14