PostMan

 

① POST 확인하기 ( 게시글 생성 )

 

 

  • PostMan 어플을 실행한다.
  • 나는 편의를 위해 왼쪽 사이드바 New Collection 부분에 필요한 url을 미리 저장해 놓았다.
  • 위 사진의 순서대로 진행해 준다! 
  • 특히 주의할 점은 [Body] - [raw] - [JSON] 으로 설정해야 한다는 것 ! 

 

② GET 확인하기 ( 게시글 조회 )

 

 

  • 아래 부분에서 POST로 저장된 데이터들을 확인 할 수 있다.

 

 

③ PUT 확인 하기 ( 게시글 수정)

 

 

  • POST와 마찬가지로 중간 Body 부분에서 내용을 수정해서 입력하면 된다.

 

 

④ DELETE 확인하기 ( 게시글 삭제 )

 

 

  • 처음엔 비밀번호를 일부러 틀리게 설정하여 값을 확인해 보았다.
  • Service에서 설정한 대로 return값으로 false 를 반환한다.

 

  • 이번엔 제대로된 비밀번호를 입력해 보았다.
  • 비밀번호가 일치하기때문에 return 값으로 true를 반환하는 것을 확인 할 수 있다.

 

h2- console로  확인하기

  • url에 localhost8080/h2-console 을 입력하면 아래와 같은 화면이 뜬다.
  • JDBC URL은 개인마다 다른데, 인텔리제이에서 파일을 실행시키면 콘솔창에서 확인할 수 있다.

 

이런 화면이 떴다면 일단 시작준비 끝 !

 

① POST/GET 확인하기 ( 게시글 생성 + 조회 )

  • 왼쪽 사이드바에 POST를 클릭한 뒤 Run을 실행시켜 주면 PostMan을 통해 save된 데이터들을 조회할 수 있다.

 

 

② PUT 확인 하기 ( 게시글 수정)

 

  • PostMan을 통해 id넘버 3인 데이터를 수정했는데, 위와 같이 잘 수정된 것을 확인할 수 있다.

 

 

③ DELETE 확인하기 ( 게시글 삭제 )

  • PostMan으로 id3번인 데이터를 삭제하였고, 위와 같이 삭제된 것을 확인할 수 있다.

 


화면단이 없어서 이렇게 PostMan 어플과 h2-console을 이용하여 내가 짠 코드가 제대로 돌아가는지 확인할 수 있는게 너무 훙미로웠다. 

앞으로 자주 사용하게 될 것 같다 : ) 

스프링부트 이용해서 게시판 서버 CRUD 구현하기 !
API 설계 부분

 

Use Case 그려보기

 

 

이렇게 하는게 맞는지 모르겠지만, 일단 https://narup.tistory.com/70 링크를 참조해서 그려본 Use Case

 

 

API 명세서 만들기

 

  • 참고로 RESTful한 API가 되기 위한 규칙이 몇 가지 있는데, (게시글로 정리할 예정)
  • 그 중 URL주소는 복수형 명사로 적는 것이 규칙인 부분이 있다. 
  • 따라서 아래 내가 작성한 URL을 좀 더 RESTful 하게 하려면 '/api/posts'와 같은 형식으로 바꿔주는게 좋다.

 

 

 

과제 구현 순서

① 인텔리제이 설정 

 

 

  • 인텔리제이를 실행한다.
  • New Project 클릭!
  • 왼쪽 사이드바에서 Spring Initializr 선택
  • 프로젝트 이름 설정
  • 경로 설정
  • Language : [Java] 선택
  •  Type : [Gradle-Grooty] 선택
  •  Java version : 17 선택
  • next 클릭

 

 

 

  • 위와 같이 아래 6개 항목을 검색해서 선택해주고, Create 클릭!
  • Spring Web
  • Spring Data JPA
  • H2 Database
  • Thymeleaf
  • Spring Boot DevTools
  • Lombok

※ 참고

 

 

  • https://start.spring.io/ 에서 위와 같은 설정을 할 수도 있다.
  • 항해99 강의는 처음 방법을 사용하였지만, 인프런 김영한 선생님의 강의나 유튜버 홍팍 선생님은 두번째 방법으로 프로젝트 초기 설정을 하셨다.
  • 이 경우 오른쪽 상단의 ADD DEPENDENCIES 를 통해 필요한 것들을 검색하고 세팅할 수 있다.

 

② 패키지 및 클래스 파일 만들기

 

 

 

  • Entity - Controller - Dto -Servie - Repositoy 패키지를 만들어준다.
  • 그리고 그 안에 필요한 클래스와 인터페이스 파일 생성
  • 사실 위에서 Delete 값을 반환 할 ResponseDto 하나를 더 만들면 좋지만 일단 진행하였다.
  • 화면단은 필요 없는 과제이기 때문에 아래 resources 부분의 static과 templates는 비어있는 상태이다.

 

③ Entity - Controller - Dto -Servie - Repositoy 코드 짜기

  • 이 부분은 과제 3 게시글 참조 

 

 PostMan  + h2-console  로 서버가 반환하는 값 확인하기

  • 이 부분은 과제 2 게시글로 참조

 

 

⑤ Github 업로드

 

GitHub - leejincha/hanghaeboard: spring homework

spring homework. Contribute to leejincha/hanghaeboard development by creating an account on GitHub.

github.com

 

[IntelliJ] IntelliJ + Github 연동하기

[IntelliJ] IntelliJ + Github 연동하기 안녕하세요. 갓대희 입니다. 이번 포스팅은 [ IntelliJ 로컬 프로젝트 Github 연동하기 ] 입니다. : ) 인텔리 제이를 통해 개발중인 로컬 프로젝트를 Github이랑 연동하는

goddaehee.tistory.com

 

1. 상속이란 ? 

  • 이미 잘 개발된 클래스를 재사용해서 새로운 클래스를 만드는 방법.
  • 다시 말해, 부모 클래스의 필드와 메소드를 자식 클래스에서 사용할 수 있도록 하는 것.
  • 따라서 중복이 되는 코드를 줄여줄 수 있고, 개발 시간을 절약해 주기 때문에 효율적이고, 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과를 가져오기 때문에 유지 보수 시간을 최소화할 수 있다는 장점이 있다.
  • 부모 클래스를 상위 클래스, 자식 클래스를 하위 클래스 또는 파생 클래스라고 부른다.

 

2. 클래스 상속

  • 프로그램에의 상속은 자식이 부모를 선택한다.
  • 선택된 부모클래스는 extends 뒤에 기술한다.
  • 단 하나의 부모클래스만 상속할 수 있다.
  • 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
  • 부모 클래스와 자식 클래스의 패키지가 다르다면, default 접근 제한을 갖는 필드와 메소드도 상속대상에서 제외된다.

 

3. 부모 생성자 호출

  • 모든 객체는 클래스의 생성자를 호출해야만 생성된다.
  • 부모 생성자는 자식 생정자의 맨 첫 줄에서 호출된다.
  • super();는 부모의 기본 생성자를 호출한다.
  • 만약 직접 자식 생성자를 선언하고 명시적으로 부모 생성자를 호출하고 싶다면 아래와 같이 작성한다.

  • super(매개값, ...)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. - 일치하지 않으면 컴파일에러
  • super(매개값, ...)는 반드시 자식 생성자 첫 줄에 위치해야 한다. - 아니면 컴파일 에러 발생

 

4. 메소드 재정의 (Overriding)

  • 자식 클래스에서 부모 클래스의 메소드를 사용하기 적합하도록 수정해서 사용하는 방법.
  • 즉, 자식 클래스에서 부모 클래스의 메소드를 다시 정의하는 것

① 메소드 재정의 규칙

  1. 부모의 메소드와 동일한 시그너처 ( 리턴 타입, 메소드 이름, 매개 변수 목록)를 가져야 한다.
  2. 접근 제한을 더 강하게 재정의할 수 없다.
  3. 새로운 예외(Exception)를 throws할 수 없다.

※ 접근 제한을 더 강하게 재정을 할 수 없다 ? 

더보기
부모 메소드가 public 접근 제한을 가지고 있을 경우 재정의하는 자식 메소드는 default 나 private 접근 제한으로 수정할 수 없다는 의미. 단, 반대는 가능. 부모 메소드가 default 접근 제한을 가지면 재정의하는 자식 메소드는 default 또는 public으로 접근 제한을 가질 수 있다.

 

@Override 어노테이션

  • 해당 메소드가 정확히 재정의된 것인지 컴파일러가 확인하기 때문에 개발자의 실수를 줄여 준다.
//부모 클래스

public class Calculator {
	double areaCircle(double r) {
    	System.out.println("Calculator 개체의 areaCircle()실행");
        return 3.14159 * r * r ;
    }
}

//자식 클래스 // 재정의

public class Computer extends Calculator {
    @Override //어노테이션 생략 가능
    double areaCircle(double r) {
    	System.out.println("Computer 객체의 areaCircle() 실행");
        return Math.PI * r * r;   
    }
}

//메소드 재정의 테스트

public class ComputerExample {
	public static void main(String[] args) {
    	int r = 20;
        
        Calulator calculrator = new Calculator();
        System.out.println(calculatro.areaCircle(r)); //314.159
        
        Computer computer = new Computer();
        System.out.println(computer.areaCircle(r)); //314.1592653589793
        
    }
}

 

③ 부모 메소드 호출

  • 자식 클래스에서 부모 클래스 메소드를 재정의하게 되면, 부모 클래스의 메소드는 숨겨진다.
  • 그러나 자식 클래스 내부에서 재정의된 부모 클래스의 메소드를 호출해야 한다면, 명시적으로 super 키워드를 븉여서 부모 메소드를 호출 할 수 있다.
  • super.부모메소드();

 

 

5. Final 클래스와 Final 메소드

  • 클래스와 메소드를 선언할 때 final 키워드가 지정되면 상속과 관련이 있다는 의미
  • final 클래스는 부모 클래스가 될 수 없다. 즉, 자식 클래스를 만들 수 없다.
  • final 키워드 때문에 최종적인 클래스가 되기 때문이다.
  • 마찬가지로, 부모 클래스 내부의 final 메소드도 최종적인 메소드가 되기 때문에 자식 클래스에서 재정의 할 수 없다.
//재정의 할 수 없는 final 메소드

public class Car {
    //필드
    public int speed;
    
    //메소드
    public void speedUp(){ speed += 1; }
    
    //final 메소드
    public final void stop() {
    	System.out.println("차를 멈춤");
    	speed = 0;
    }
}


public class SportCar extends Car {
    @Override
    public void speedUp(){ speed += 10; }
    
    @Override
    public void stop(){
    	System.out.println("스포츠카를 멈춤");   //stop()은 final 메소드기 때문에 재정의 할 수 없음
        speed = 0;
    }
}

 

 

6. protected 접근 제한자

  • protected 는 public과 default 접근 제한의 중간
  • 같은 패키지에서는 default와 같이 접근 제한이 없지만, 다른 패키지에서는 자식 클래스만 접근을 허용한다.
  • 단, 자식 클래스에서 부모 클래스의 생성자를 호출할 때, new 연산자를 사용해서 직접 호출할 수 없고, super(); 를 이용해야 한다.

'Coding > Java' 카테고리의 다른 글

[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[19] JAVA 패키지와 접근 제한자  (0) 2022.11.29
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25

 


https://velog.io/@seungho1216/

 

Spring Boot

스프링 부트(Spring Boot)는 스프링(Spring)을 더 쉽게 이용하기 위한 도구이다. 스프링 이용하여 개발을 할 때, 이것저것 세팅을 해야 될 요소들이 많은데, Spring Boot는 매우 간단하게 프로젝트를 설정할 수 있게 하여 Spring 개발을 조금 더 쉽게 만들어주는 역할을 한다.

User는 스프링을 사용하기 위해서 이것저것 다양한 설정을 직접 해줘야된다는 문제점이 있다. 개발자가 실행환경이나 의존성 관리 등의 인프라 관련 등에 쓰는 에너지가 소요되는데, 프로그래밍을 하는 데 있어 매우 중요한 비즈니스를 만들기 위한 프로그래밍에 조금 더 에너지를 투입할 수 있게 Spring의 많은 부분을 자동화하였고, 많은 개발자들이 현재 Spring Boot을 이용하여 개발을 진행하고 있다.

 

참고 : https://melonicedlatte.com/2021/07/11/174700.html


Controller 

Spring Framework의 Controller는 사용자가 화면(View)단에서 입력이나 어떤 이벤트를 했을 경우, 그 이벤트에 맞는 화면(View)이나 비지니스 로직(Model)을 실행할 수 있도록 업데이트 해주는 역할을 한다. 즉, Model과 View를 연결해주는 다리 역할이라고 할 수 있다. 서버에서 기능별 URL이라는 API를 개설해 놓았고, 클라이언트는 필요한 정보를 얻기 위해 적절한 API에 요청한다. 즉 Controller는 이런 창구 역할을 하는 API들을 모아놓은 클래스라고 할 수 있다.

  • Front-end에서 들어오는 클라이언트 측의 요청이 가장 먼저 서버 측과 맞닿는 부분
  • Client의 요청을 받았을 때 그 요청에 대해 실제 업무를 수행하는 Service를 호출
  • 클라이언트가 보낸 데이터가 있다면 Service를 호출할 때 전달하기 쉽게 데이터의 가공
  • 모델의 업무 수행이 완료되면 그 결과를 바탕으로 화면을 구성하도록 View에 전달
  • @Controller 어노테이션을 사용하여 만들어진 컨트롤러 클래스에 라우팅(Routing)할 수 있도록 요청 URL에 대해 해당하는 메소드를 매핑해줄 수 있도록 하기 위해 @RequestMapping 어노테이션을 사용한다.

참고 : https://yongku.tistory.com/2348


Service

  • Service : Controller의 요청을 받아 알맞은 정보를 가공 Controller에게 재전달한다.
  • Service는 위에서 언급했듯이 Repository에서 얻어온 정보를 바탕으로 자바 문법을 이용하여 가공 후 다시 Controller에게 정보를 보내는 곳이다.
  • 클라이언트 즉 controller 쪽에서 바로 데이터베이스에 접근하여 정보를 얻고 가공해서 가져가는 것은 위험하다.
  • 정보를 직접 CRUD하고 가공하는 과정에서 테이블에 저장된 원본의 정보가 손상될 우려가 크기 때문이다.
  • 따라서 정보 변동의 위험이 큰 로직은 Service에서 진행한다.
  • 추가로 이때 원본의 데이터를 사용하는 것이 아니라 데이터베이스에서 추출한 정보의 복사본인 DTO를 만들어서 로직을 조작한다.

 

참고 : https://velog.io/@seungho1216/Spring-BootController-Service-Repository%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 


Repository

  • Repository는 직역해도 '저장소'로 데이터베이스와 깊은 연관이 있음을 알 수 있다.
  • 데이터단에 직접 매칭되는 Entity라는 것이 있는데, 이 Entity를 통해 데이터 테이블이 생성이 되면, 받아온 정보를 데이터베이스(ex. MySQL, mariaDB)에 저장하고 조회하는 기능을 수행한다.
  • Repository : Entity에 의해 생성된 DB에 접근하는 메서드를 사용하기위한 interface이다.
  • JPA를 상속받음으로써 기본적인 CRUD의 동작(함수 사용)이 가능해진다.
  • JpaRepository<대상 엔티티, Entity에 접근할 객체의 Type>

< 중간 정리 >

 

출처 : 스파르타코딩클럽 스프링 입문 강의자료

 

  • 컨트롤러 : @Controller (프레젠테이션 레이어, 웹 요청과 응답을 처리함)
  • 로직 처리 : @Service (서비스 레이어, 내부에서 자바 로직을 처리함)
  • 외부I/O 처리 : @Repository (퍼시스턴스 레이어, DB나 파일같은 외부 I/O 작업을 처리함)

DAO, DTO, VO 란? 

 

DAO

  • DAO(Data Access Object) 는 데이터베이스의 data에 접근하기 위한 객체. DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용한다.

DTO

  • DTO(Data Transfer Object) 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체(getter & setter 만 가진 클래스)이다.
  • 유저가 입력한 데이터를 DB에 넣는 과정을 보면,
    • 유저가 자신의 브라우저에서 데이터를 입력하여 form에 있는 데이터를 DTO에 넣어서 전송한다.
    • 해당 DTO를 받은 서버가 DAO를 이용하여 데이터베이스로 데이터를 집어넣는다.

VO

  • VO(Value Object) 값 오브젝트로써 값을 위해 쓰인다. read-Only 특징(사용하는 도중에 변경 불가능하며 오직 읽기만 가능)을 가진다.
  • DTO와 유사하지만 DTO는 setter를 가지고 있어 값이 변할 수 있다.

참고 : https://melonicedlatte.com/2021/07/24/231500.html


Entitiy

 

데이터베이스는 엑셀처럼 2차원 테이블이라고 생각하면 되는데, 이 테이블에 서비스에서 필요한 정보를 다 저장하고 활용하게 된다.
엑셀의 세로의 열 부분이 Column 이고, 가로의 행 부분이 엔티티 객체가 된다. 이 테이블 전체가 엔티티 이고, 각 1개의 행들이 엔티티 객체가 되는 것이라고 생각하면 된다. 

 

  • 실제 DB에 저장되는 내용들을 구현하는 class이다.
  • 테이블에 대응하는 하나의 클래스라고 생각
  • 하나의 객체가 DB의 하나의 Column처럼 작용한다.

참고 : https://velog.io/@jayjay28/%EC%97%94%ED%8B%B0%ED%8B%B0Entity


Annotation

  • 사전적 의미로는 주석이라는 뜻이다.
  • 자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.
    - 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.
    - meta data : 데이터를 위한 데이터

참고(꼭 읽어보기) : https://velog.io/@ruinak_4127/Annotation%EC%9D%B4%EB%9E%80


JPA

  • Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
  • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
  • 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함
  • 참고로, JPA는 수정 메소드를 제공하지 않는다. 하지만 당연히 수정은 필요하기 때문에 JPA는 데이터 수정시, 매핑된 객체(테이블 데이터)를 조회해서 값을 변경 후 커밋하면 DB 서버에 UPDATE 문을  전송하여 UPDATE를 실행한다.
  • 추가적으로 알아둬야 할 것은, 스프링에서 흔히 사용하는 것으로 알고있는 JPA는, JPA를 이용하는 spring-data-jpa 프레임워크이지 JPA는 아니다.

참고 : https://dbjh.tistory.com/77


@RequestParam, @PathVariable, @RequestBody

 

 

@RequestBody

  • 요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation이다.
  • POST나 PUT, PATCH로 요청을 받을때에, 요청에서 넘어온 body 값들을 자바 타입으로 파싱해준다.
  • HTTP POST 요청에 대해 request body에 있는 request message에서 값을 얻어와 매핑한다.
  • RequestData를 바로 Model이나 클래스로 매핑한다.
  • 이를테면 JSON 이나 XML같은 데이터를 적절한 messageConverter로 읽을 때 사용하거나 POJO 형태의 데이터 전체로 받는 경우에 사용한다.

@RequestParam

  • @PathVariable과 비슷하다.
  • request의 parameter에서 가져오는 것이다. method의 파라미터에 사용된다.
  • ?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해준다.
  • HTTP GET 요청에 대해 매칭되는 request parameter 값이 자동으로 들어간다.
  • url 뒤에 붙는 parameter 값을 가져올 때 사용한다.
  • @RequestParam 어노테이션의 괄호 안의 문자열이 전달 인자 이름(실제 값을 표시)이다.


@PathVariable

  • method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.
  • HTTP 요청에 대해 매핑되는 request parameter 값이 자동으로 Binding 된다.
  • uri에서 각 구분자에 들어오는 값을 처리해야 할 때 사용한다.
  • REST API에서 값을 호출할 때 주로 많이 사용한다.

 

< 간단 정리 >

@RequestParam : GET 방식으로 넘어온 URI의 queryString을 받기 적절

@PathVariable : URI 경로의 일부를 파라미터로 사용할 때 이용

@RequestBody : xml이나 json 기반의 메시지를 사용하는 요청의 경우 유용

 

참고 :

https://velog.io/@ruinak_4127/Annotation%EC%9D%B4%EB%9E%80

https://u0hun.tistory.com/21

패키지(Package)

  • 자바에서는 클래스를 체계적으로 관리하기 위해 패키지(Package)를 사용한다.
  • 패키지의 물리적인 형태는 파일 시스템의 폴더이지만, 단순히 파일 시스템의 폴더 기능만 하는 것은 아니다.
  • 패키지는 클래스의 일부분으로 클래스를 유일하게 만들어 주는 식별자 역할을 한다.
  • 즉, 클래스 이름이 동일하더라도 패키지가 다르면 다른 클래스로 인식한다.
  • 형태는 : package 상위패키지.하위패키지.클래스

 

패키지 선언

  • 클래스를 작성할 때 해당 클래스가 어떤 패키지에 속할 것인지를 선언하는 것을 의미한다.
  • 패키지는 클래스의 일부이다. 이유는, 클래스만 따로 복사해서 다른 곳으로 이동하면 클래스를 사용할 수 없기 때문! 
  • JDK 8 이전 버전에서는 패키지가 없는 클래스를 선언할 수 있었지만, JDK 11버전 이후 버전부터는 패키지가 없는 클래스를 생성하면 컴파일 에러가 뜬다.

① 패키지 이름의 규칙

  • 숫자로 시작해서는 안 되고, _ $를 제외한 특수문자를 사용할 수 없다.
  • java로 시작하는 패키지는 자바 표준 API에서만 사용하기 때문에 사용하서는 안된다.
  • 모두 소문자로 작성하는 것이 관례이다.
  • 참고로 여러 개발 회사들이 함께 참여하는 프로젝트의 경우 중복을 방지하기 위해 회사 도메인 이름으로 패키지를 만든다.

 

② import문

  • 사용하고자 하는 클래스 또는 인터페이스가 다른 패키지에 소속되어 있따면 import문으로 해당 패키지의 클래스 또는 인터페이스를 가져와 사용할 것임을 컴파일러에게 알려줘야 한다.

 

  • 형식은 다음과 같다.
    • import 상위패키지.하위패키지.클래스이름;
    • import 상위패키지.하위패키지.*; (사용하고자 하는 클래스들이 동일한 패키지 소속일 경우 *을 사용)

 

  • import문은 패키지 선언과 클래스 선언 사이에 작성한다.
  • import문은 개수에 제한이 없고 얼마든지 추가할 수 있다.
  • 주의할 점은 상위패키지를 import했다고 해서 하위 패키지까지 impoprt되는 것은 아니라는 점
  • 즉, com.hankook과 com.hankook.project는 서로 다른 패키지로 인식된다.

 

 

※ 만약 서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import된 경우 컴파일에러가 발생한다.

  • 이 경우에는 정확하게 패키지가 포함된 클래스 전체 이름을 기술해야 한다.
  • 예를 들어, 두 패키지에 Tire라는 동일한 클래스명이 존재할 경우, 아래와 같이 전체 이름을 표기.
  • ex) sec06.exam02.hankook.Tire Tire1 = ....,  sec06.exam02.kumho.Tire Tire2 = ....

 

접근 제한자

  • 접근 제한자(Access Modifier)는 말 그래로 접근을 제한하기 위해 사용된다.
  • 여기서 접근이란, 클래스 및 인터페이스 그리고 이들이 가지고 있는 멤버의 접근을 의미한다.
  • 클래스와 인터페잇를 다른 패키지에서 사용 못하도록 막을 필요가 있을 경우 사용한다.
  • 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드나 메소드를 사용하지 못하도록 하는 경우도 사용한다.
  • 클래스를 선언할 때 public을 생략했다면, 클래스는 defalut 접근 제한을 가진다.
  • 클래스에 생성자를 선언하지 않으면 컴파일러에 의해 자동으로 기본 생성자가 추가된다. 

 

접근제한 적용 대상 접근할 수 없는 클래스
public 클래스, 필드, 생성자, 메소드 없음
protected 필드, 생성자, 메소드 자식 클래스가 아닌 다른 패키지에 소속된 클래스
default 클래스, 필드, 생성자, 메소드 다른 패키지에 소속된 클래스
private 필드, 생성자, 메소드 모든 외부 클래스

 

 

Getter와 Setter 메소드

  • 객체의 필드를 객체 외부에서 직접적으로 접근하는 것을 막기위해 사용.
  • 그 이유는 외부에서 마음대로 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질 수 있기 때문
  • 예를 들면, 자동차 속력은 음수가 될 수 없는데 외부에서 음수로 변경할 경우 무결성이 깨진다고 할 수 있다.
  • 클래스를 선언할 때 가능하다면 필드를 private로 선언해서 외부로부터 보호하고, 필드에 대한 Setter와 Getter 메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋다.

 

Setter : 외부에서 값을 받아 필드를 변경하는 메소드

  • 필드는 외부에서 접근할 수 없도록 막고, 외부에서 메소드를 통해 필드에 접근하도록 하는 메소드
  • 메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있도록 한다.

Getter : 필드의 값을 외부로 리턴해 주는 메소드

  • 메소드로 필드값을 가공한 후 외부로 전달하는 역할
  • 예를 들어 자동차의 속도를 마일에서 km단위로 환산해서 외부로 리턴해주는 getSpeed() 메소드를 다음과 같이 작성 할 수 있다.

'Coding > Java' 카테고리의 다른 글

[21] JAVA 타입변환과 다형성  (1) 2022.12.02
[20] JAVA 상속  (0) 2022.11.30
[18] JAVA 인스턴스(객체) Instance  (0) 2022.11.27
[17] JAVA 자료구조 ArrayList  (0) 2022.11.25
[16] JAVA 메소드  (0) 2022.11.24

+ Recent posts