• 로그인 회원가입에 여러가지 조건을 넣으면서 정규식 표현을 사용하게 되었다.
  • 여러 블로그 자료는 많은데, 다들 사용법이 다 달라서 한번 정리해보려 작성하는 글 : ) 

정규식이란?

  • 정규식(正規式)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다. 
  • 정규 표현식은 많은 텍스트 편집기와 프로그래밍 언어에서 문자열의 검색과 치환을 위해 지원하고 있다.
  • 검색 엔진, 워드 프로세서와 문서 편집기의 찾아 바꾸기 대화상자, 그리고 sed, AWK와 같은 문자 처리 유틸리티, 어휘 분석에 사용된다.
  • 정규 표현식이라는 문구는 일치하는 텍스트가 준수해야 하는 "패턴"을 표현하기 위해 특정한 표준의 텍스트 신택스를 의미하기 위해 사용된다. 
  • 정규 표현식은 유효성 검사 코드 작성 시 가장 효율적인 방법이다.

 

사용규칙

 

문자 클래스, "["와 "]" 사이에 포함된 문자 집합 외부에서는 12개의 문자가, 내부에서는 오직 4개의 문자("\", "^", "-", "]", 자바 닷넷은 "["를 포함)만 특수문자를 의미한다. 아래는 POSIX 기본 및 확장 표준의 문법이다.

 

POSIX 확장 문법

 

문자 클래스

 

 

 

자주 쓰는 정규 표현식

 

https://hbase.tistory.com/160

 

정규식 사용법 및 사용예

  • 정규 표현식을 작성하는 방법은 자바 API java.util.regex 패키지를 사용해야 한다.
  • 자바에서 정규표현식을 사용할때에는 java.util.regex 패키지 안에 있는 Pattern클래스와 Matcher클래스를 주로 사용한다.

① Pattern 클래스

  • 정규 표현식에 대상 문자열을 검증하는 기능은  matches()메소드를 활용하여 검증할 수 있다. 
  • matches() 메서드의 첫번째 매개값은 정규표현식이고 두번째 매개값은 검증 대상 문자열이다.
  • 검증 후 대상문자열이 정규표현식과 일치하면 true, 그렇지 않다면 false값을 리턴한다.

 

Pattern 클래스 주요 메서드
compile(String regex) : 주어진 정규표현식으로부터 패턴을 만듭니다.
matcher(CharSequence input) : 대상 문자열이 패턴과 일치할 경우 true를 반환합니다.
asPredicate() : 문자열을 일치시키는 데 사용할 수있는 술어를 작성합니다.
pattern() : 컴파일된 정규표현식을 String 형태로 반환합니다.
split(CharSequence input) : 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리합니다.

Parttern 플래그 값 사용(상수)
Pattern.CANON_EQ : None표준화된 매칭 모드를 활성화합니다.
Pattern.CASE_INSENSITIVE : 대소문자를 구분하지 않습니다. 
Pattern.COMMENTS : 공백과 #으로 시작하는 주석이 무시됩니다. (라인의 끝까지).
Pattern.MULTILINE : 수식 ‘^’ 는 라인의 시작과, ‘$’ 는 라인의 끝과 match 됩니다.
Pattern.DOTALL : 수식 ‘.’과 모든 문자와 match 되고 ‘\n’ 도 match 에 포함됩니다.
Pattern.UNICODE_CASE : 유니코드를 기준으로 대소문자 구분 없이 match 시킵니다.
Pattert.UNIX_LINES : 수식 ‘.’ 과 ‘^’ 및 ‘$’의 match시에 한 라인의 끝을 의미하는 ‘\n’만 인식됩니다.

 

 

② Matcher 클래스

  • Matcher 클래스는 대상 문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 판별할 때 주로 사용된다.
  • Matcher 클래스의 입력값으로는 CharSequence라는 새로운 인터페이스가 사용되는데 이를 통해 다양한 형태의 입력 데이터로부터 문자 단위의 매칭 기능을 지원 받을 수 있다.
  • Matcher객체는 Pattern객체의 matcher() 메소드를 호출하여 받아올 수 있다.

 

Matcher 클래스 주요 메서드


matches() : 대상 문자열과 패턴이 일치할 경우 true 반환합니다.
find() : 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
find(int start) : start위치 이후부터 매칭검색을 수행합니다.
start() : 매칭되는 문자열 시작위치 반환합니다.
start(int group) : 지정된 그룹이 매칭되는 시작위치 반환합니다.
end() : 매칭되는  문자열 끝 다음 문자위치 반환합니다.
end(int group) : 지정되 그룹이 매칭되는 끝 다음 문자위치 반환합니다.
group() : 매칭된 부분을 반환합니다.
group(int group) : 매칭된 부분중 group번 그룹핑 매칭부분 반환합니다. 
groupCount() : 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환합니다.

 

 

 

③ 회원가입 구현 시 사용한 정규식 방법

 

1. build.gradle 코드 추가

 

2. RequestDto

@Size 어노테이션과 @Pattern 어노테이션이 사용되었다.

 

 

3. Contoller 

@Valid 어노테이션이 사용되었다.

@Valid 어노테이션 또한 유효성 검증과 관련이 있는데, 다음 게시물에서 정리하는 걸로 ! 

 

 


참고 자료:

https://coding-factory.tistory.com/529

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D

https://hbase.tistory.com/160

 

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

[14] JPA (1)  (0) 2022.12.06
[13] @Valid, @Validated (작성중. 수정필요)  (0) 2022.12.06
[11] Database 와 SQL  (0) 2022.12.06
[10] Spring Boot 어노테이션 정리  (0) 2022.12.06
[09] 스프링 MVC 이해  (0) 2022.12.04

 

 

1. 어려웠던 부분 : 과제를 구현하는 것 자체가 너무 어렵다 ! 에러를 하나 해결하면 또 다른 에러가 자꾸자꾸 나오는 코딩의 세계^__^  그래도 같이 공부하시는 분들이 화면공유도 봐주시면서 계속 알려주시고 지식 나눔을 해주셔서 그나마 헤쳐나가는 것 같다. 오늘은 인광님한테 거의 개인과외 받다시피 배웠는데, 포스트맨에서 토큰을 사용해서 조회하는 방법과 ResponseEntity 사용 법을 알려주셨다. 진짜 인광님 강의 없었으면 자료 보고도 구현하지 못했을 것 같다. 감사합니다 : ) 

그리고 정규식 표현과 관련해서 은솔님이랑 윤재님이랑 이것 저것 실험을 해보면서 코드를 구현했다. 일단 엔티티에는 정규식 표현을 쓰지 않느다는것, 컨트롤러 단에서 해결을 해야하기 때문에 디티오에서 정규식 처리를 해줬다. 그리고 ^는 시작 $는 끝을 의미한다는 것. 정규식은 자료가 너무 많아서 제대로된 자료를 찾아서 공부하려면 공식 사이트를 찾아봐야 할 것 같다.

 

2. 느낀 점 : 오늘 조원 한 분이 개인적인 이유로 항해를 나가셨다. 시작은 분명 41명 정도 되었던 것 같은데, 5주차에 접어든 지금 34명으로 인원이 줄어들었다. 항해가 힘들어서 나간 사람도 있을 거고, 더 나은 기회가 생겨 나가신 분도 있을 텐데 한분 한분 나가실 때마다 아쉬운 마음이 드는 건 어쩔 수 없는 것 같다. 두바이에 있으면서 항상 느꼈던 거지만, 떠나는 사람보다 남겨진 사람들의 마음이 괜히 싱숭생숭하고 힘들고 그렇다. 원래 그렇다. 오늘 기술 매니저님 말씀 듣고 좀 흔들리긴 했지만, 일단 시작했으니 끝까지 최선을 다하기로 마음을 다잡았다 !

 

3. 새로 알게 된 내용 

  • @Valid를 이용한 유효성 검사 + 정규식 표현
  • ResponseEntity 사용법
  • 회원가입 정규식 표현은 Entity가 아니라 Dto에서 처리하기 
  • 스프링 데이터베이스 초기화 - spring boot ddl auto
  • Entity에서 필요한 값만 Dto에 담아서 Service 단에서 처리하기 ( 이번 과제에서 POST/UPDATE 부분에 content, title만 입력 할 수 있었던 방법은 Dto 부분 설정이었다는 것!) - 내일 정리

 

4. 셀프칭찬 (오늘 잘한 일) : 오늘도 최선을 다했다 ! ^___^ 염치 불구하고 또 여기 저기 다니면서 물어보고 오늘 목표했던 과제 레벨 1을 일단은 마무리했다. 오늘 목표는 끝 ! 내일 일은 내일의 내가 또 하겠지 ! ㅎㅎ 내일은 코드 한줄씩 주석 달면서 이해부터 하는 걸로! 

 

5. 이번주 할 일 : JPA, JWT, SQL 개념 잡기(이건 수요일)/ Java chap09-1 공부 / 과제2 시작/ 코드 주석달면서 이해하기

 


[오늘 공부한 부분]

  • Java chap 08 - 2 (인터페이스 공부)
  • 스프링 과제 레벨 1 구현
  • 과제하면서 사용했던 어노테이션 정리

[10] Spring Boot 어노테이션 정리

 

[10] Spring Boot 어노테이션 정리

Annotation이란? 사전적 의미로는 주석이라는 뜻이다. 자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다. 프로그램에게 추가적인 정보를 제공해주

leejincha.tistory.com

[24] JAVA 타입 변환과 다형성

 

[24] JAVA 타입 변환과 다형성

인터페이스의 다형성 : 프로그램 소스 코드는 변함이 없는데, 구현 객체를 교환함으로써 프로그램의 실행결과가 다양해 지는 것 상속은 같은 종류의 하위 클래스를 만드는 기술이고 인터페이스

leejincha.tistory.com

[11] Database 와 SQL

 

[11] Database 와 SQL

Database Database를 한 마디로 정의하면 ‘데이터의 집합’ 이라고 할 수 있습니다. DB는 우리가 매일 사용하는 카톡 메시지, 인스타그램의 사진등의 정보를 저장하고 관리해 줍니다. ① DBMS DBMS 는

leejincha.tistory.com

 

 

Database

  • Database를 한 마디로 정의하면 ‘데이터의 집합’ 이라고 할 수 있습니다.
  • DB는 우리가 매일 사용하는 카톡 메시지, 인스타그램의 사진등의 정보를 저장하고 관리해 줍니다.

 

① DBMS

  • DBMS 는 ‘Database Management System’ 의 약자로 Database를 관리하고 운영하는 소프트웨어를 의미합니다.

② RDBMS

  • RDBMS는 ‘Relational DBMS’의 약자로 관계형 데이터베이스라고 불립니다.
  • RDBMS는 테이블(table)이라는 최소 단위로 구성되며, 이 테이블은 열(column)과 행(row)으로 이루어져 있습니다.
  • RDBMS의 종류 : 각 제품 간 차이가 크지 않아서 사실 어떤 걸 사용하든 좋습니다. 유료인 Oracle을 제외하고 보통 MySQL, PostgreSQL 중에서 많이 고르는 편입니다.

 

 

SQL

  • SQL은 ‘Structured Query Language’ 의 약자로 RDBMS에서 사용되는 언어입니다.
  • 수 많은 정보를 Database에서 조작하고 관리하기 위해서는 SQL 언어를 사용해야합니다.
  • 국제표준화기구에서 SQL에 대한 표준을 정해서 발표하고 있습니다.
  • 하지만, DBMS를 만드는 회사가 여러 곳이기 때문에 DBMS 마다 표준 SQL을 준수하되, 각 제품의 특성을 반영하기 위한 약간의 차이가 존재합니다. 

① DDL

Data Definition Language’ 의 약자로 테이블이나 관계의 구조를 생성하는데 사용합니다

 

  • CREATE : 새로운 데이터베이스 및 테이블을 생성해 줍니다.

 

 

  • ALTER : 데이터베이스와 테이블의 내용을 수정할 수 있습니다.

  • DROP : 데이터베이스와 테이블을 삭제할 수 있습니다. 데이터 및 테이블 전체를 삭제합니다.

  • TRUNCATE : 데이터베이스와 테이블을 삭제할 수 있습니다. 최초 테이블이 만들어졌던 상태 즉, 컬럼값만 남깁니다.


② DCL

 ‘Data Control Language’ 의 약자로 데이터의 사용 권한을 관리하는데 사용합니다.

 

  • GRANT : 사용자 또는 ROLE에 대해 권한을 부여할 수 있습니다. 

  • REVOKE : 사용자 또는 ROLE에 부여한 권한을 회수할 수 있습니다.


③ DML

 ‘Data Manipulation Language’ 의 약자로 테이블에 데이터를 검색, 삽입, 수정, 삭제하는데 사용합니다.

 

  • INSERT : 테이블에 새로운 row를 추가할 수 있습니다.

  • SELECT : 테이블의 row를 선택할 수 있습니다.

  • UPDATE : 테이블의 row의 내용을 수정할 수 있습니다.

  • DELETE : 테이블의 row를 삭제할 수 있습니다.

 

 

PRIMARY KEY vs FOREIGN KEY

 


참고 자료 :

스파르타 코딩클럽 스프링 입문주차 강의

https://teamsparta.notion.site/Database-SQL-c1399284be2f4638bce8d38f8d2c71ed

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

[13] @Valid, @Validated (작성중. 수정필요)  (0) 2022.12.06
[12] 정규식(regex, rational expression)  (0) 2022.12.06
[10] Spring Boot 어노테이션 정리  (0) 2022.12.06
[09] 스프링 MVC 이해  (0) 2022.12.04
[08] 웹 동작방식  (0) 2022.12.04

Annotation이란?

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

 

Anotation 제약조건
@ComponentScan
  • @Component와 @Service, @Repository, @Controller, @Configuration이 붙은 클래스 Bean들을 찾아서 Context에 bean등록을 해주는 Annotation이다.
  • @Component Annotation이 있는 클래스에 대하여 bean 인스턴스를 생성
  • Spring에서 @Component로 다 쓰지 않고 @Repository, @Service, @Controller등을 사용하는 이유는, 예를들어 @Repository는 DAO의 메소드에서 발생할 수 있는 unchecked exception들을 스프링의 DataAccessException으로 처리할 수 있기 때문이다.
@Component
  • @Component 은 개발자가 직접 작성한 Class를 Bean으로 등록하기 위한 Annotation이다.
  • Component에 대한 추가 정보가 없다면 Class의 이름을 camelCase로 변경한 것이 Bean id로 사용된다.
  • @Component는 @Bean과 다르게 name이 아닌 value를 이용해 Bean의 이름을 지정한다.
@Bean
  • @Bean은 개발자가 직접 제어가 불가능한 외부 라이브러리등을 Bean으로 만들려할 때 사용되는 Annotation이다.
@Autowired
  • 무조건적인 객체에 대한 의존성을 주입시킨다.
  • @Autowired를 사용할 시, 스프링이 자동적으로 값을 할당한다.
  • Controller 클래스에서 DAO나 Service에 관한 객체들을 주입 시킬 때 많이 사용한다.
@Controller
  • Spring MVC에서 Controller클래스에 쓰인다.
  • Spring의 Controller를 의미한다.
@RestController
  • Spring에서 Controller 중 View로 응답하지 않는, Controller를 의미한다.
  • method의 반환 결과를 JSON 형태로 반환한다.
  • 이 Annotation이 적혀있는 Controller의 method는 HttpResponse로 바로 응답이 가능하다.
  • @ResponseBody 역할을 자동적으로 해주는 Annotation이다.
  • @Controller + @ResponseBody를 사용하면 @ResponseBody를 모든 메소드에서 적용한다.

@Controller 와 @RestController 의 차이

@Controller
API와 view를 동시에 사용하는 경우에 사용한다.
대신 API 서비스로 사용하는 경우는 @ResponseBody를 사용하여 객체를 반환한다.
view(화면) return이 주목적이다.

@RestController
view가 필요없는 API만 지원하는 서비스에서 사용한다.
Spring 4.0.1부터 제공
@RequestMapping 메서드가 기본적으로 @ResponseBody 의미를 가정한다.
data(json, xml 등) return이 주목적이다.
즉 @RestController = @Controller + @ResponseBody 이다.

@Service
  • 비즈니스 로직을 수행하는 Class라는 것을 나타내는 용도이다.
@Repository
  • DataBase에 접근하는 method를 가지고 있는 Class에서 쓰인다.
@SpringBootApplication
  • @Configuration, @EnableAutoConfiguration, @ComponentScan 3가지를 하나의 애노테이션으로 합친 것이다.
@RequestMapping
  • 요청 URL을 어떤 method가 처리할지 mapping해주는 Annotation이다.
  • Controller나 Controller의 method에 적용한다.
  • 요청을 받는 형식인 GET, POST, PATCH, PUT, DELETE 를 정의하기도 한다.
  • 요청 받는 형식을 정의하지 않는다면, 자동적으로 GET으로 설정된다.
@GetMapping
  • @RequestMapping(Method=RequestMethod.GET)과 같다.
  • @PostMapping, @PutMapping, @PatchMapping, @DeleteMapping 등 도 있다.
@Valid
  • 유효성 검증이 필요한 객체임을 지정한다.
@RequestAttribute
  • Request에 설정되어 있는 속성 값을 가져올 수 있다.
@RequestBody
  • 요청이 온 데이터(JSON이나 XML형식)를 바로 Class나 model로 매핑하기 위한 Annotation이다.
@RequestHeader
  • Request의 header값을 가져올 수 있다. 메소드의 파라미터에 사용한다.
@RequestParam
  • url 뒤에 붙는 parameter 값을 가져올 때 사용한다.
  • ?moviename=thepurge 와 같은 쿼리 파라미터를 파싱해준다.
@ResponseBody
  • HttpMessageConverter를 이용하여 JSON 혹은 xml 로 요청에 응답할수 있게 해주는 Annotation이다.
@PathVariable

  • method parameter 앞에 사용하면서 해당 URL에서 {특정값}을 변수로 받아 올 수 있다.
  • REST API에서 값을 호출할 때 주로 많이 사용한다.

 

Lombok Annotation

Anotation 제약조건
@NoArgsConstructor
  • 기본생성자를 자동으로 추가한다.
  • Entity Class를 프로젝트 코드상에서 기본생성자로 생성하는 것은 금지하고, JPA에서 Entity 클래스를 생성하는것은 허용하기 위해 추가한다.
@AllArgsConstructor
  • 모든 필드 값을 파라미터로 받는 생성자를 추가한다.
@RequiredArgsConstructor
  • final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 추가한다.
@Getter
  • Class 내 모든 필드의 Getter method를 자동 생성한다.
@Setter
  • Class 내 모든 필드의 Setter method를 자동 생성한다.
  • Controller에서 @RequestBody로 외부에서 데이터를 받는 경우엔 기본생성자 + set method를 통해서만 값이 할당된다.
  • 그래서 이때만 setter를 허용한다.
  • Entity Class에는 Setter를 설정하면 안된다.
  • 차라리 DTO 클래스를 생성해서 DTO 타입으로 받도록 하자
@Builder
  • 빌더에 포함된다.

 

JPA Annotation

  • JPA를 사용하면 DB 데이터에 작업할 경우 실제 쿼리를 사용하지 않고 Entity 클래스의 수정을 통해 작업한다
Anotation 제약조건
@Entity
  • 실제 DB의 테이블과 매칭될 Class임을 명시한다.
@Table
  • Entity Class에 매핑할 테이블 정보를 알려준다.
@Id
  • 해당 테이블의 PK 필드를 나타낸다.
@GeneratedValue
  • PK의 생성 규칙을 나타낸다.
  • 가능한 Entity의 PK는 Long 타입의 Auto_increment를 추천
  • 스프링 부트 2.0에선 옵션을 추가하셔야만 auto_increment가 된다.
  • 기본값은 AUTO로, MySQL의 auto_increment와 같이 자동 증가하는 정수형 값이 된다.
@Column
   테이블의 컬럼을 나타내며, 굳이 선언하지 않더라도 해당 Class의 필드는 모두 컬럼이 된다.

  • @Column을 생략하면 필드명을 사용해서 컬럼명과 매핑
  • @Column을 사용하는 이유는, 기본값 외에 추가로 변경이 필요한 옵션이 있을 경우 사용한다.
  • 문자열의 경우 VARCHAR(255)가 기본값인데, 사이즈를 500으로 늘리고 싶거나(ex: title),
    타입을 TEXT로 변경하고 싶거나(ex: content) 등의 경우에 사용

 

Validation Annotation ( @Valid)

Anotation 제약조건
@NotNull Null 불가
@Null Null만 입력 가능
@NotEmpty Null, 빈 문자열 불가
@NotBlank Null, 빈 문자열, 스페이스만 있는 문자열 불가
@Size(min=,max=) 문자열, 배열등의 크기가 만족하는가?
@Pattern(regex=) 정규식을 만족하는가?
@Max(숫자) 지정 값 이하인가?
@Min(숫자) 지정 값 이상인가
@Future 현재 보다 미래인가?
@Past 현재 보다 과거인가?
@Positive 양수만 가능
@PositiveOrZero 양수와 0만 가능
@Negative 음수만 가능
@NegativeOrZero 음수와 0만 가능
@Email 이메일 형식만 가능
@Digits(integer=, fraction = ) 대상 수가 지정된 정수와 소수 자리 수 보다 작은가?
@DecimalMax(value=)  지정된 값(실수) 이하인가?
@DecimalMin(value=) 지정된 값(실수) 이상인가?
@AssertFalse false 인가?
@AssertTrue true 인가?

 

 


참고자료:

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

 

@ Annotation이란?

@Annotation, @Reflection, @Lombok Annotation, @JPA Annotation

velog.io

https://bamdule.tistory.com/35

 

[Spring Boot] @Valid 어노테이션으로 Parameter 검증하기

java.validation의 @Valid 어노테이션 사용법 정리 글입니다. Spring Boot 라이브러리에서 기본적으로 탑재된 기능이며 따로 dependency해 줄 필요가 없습니다. Spring Boot Version은 2.2.2.RELEASE 입니다. 1. java.valid

bamdule.tistory.com

 

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

[12] 정규식(regex, rational expression)  (0) 2022.12.06
[11] Database 와 SQL  (0) 2022.12.06
[09] 스프링 MVC 이해  (0) 2022.12.04
[08] 웹 동작방식  (0) 2022.12.04
[07] 항해99 주특기 입문 1주차 - 주특기 시험 (API 구현)  (3) 2022.12.01
  • 인터페이스의 다형성 : 프로그램 소스 코드는 변함이 없는데, 구현 객체를 교환함으로써 프로그램의 실행결과가 다양해 지는 것
  • 상속은 같은 종류의 하위 클래스를 만드는 기술이고 인터페이스는 사용 방법이 동일한 클래스를 만드는 기술이라는 차이가 있다.
  • 다형성을 구현하는 방법은 비슷하다.

 

자동 타입 변환(Promotion)

  • 자동 타입 변환 : 구현 객체가 인터페이스 변수에 대입되는 것
  • 필드와 매개변수 타입을 인터페이스로 선언하면 다양한 구현 객체를 대입해서 실행결과를 다양하게 만들 수 있다.
  • 인터페이스 변수 = 구현객체;

 

https://hyuntaekhong.github.io/blog/java-basic21/

 

 

다형성

 

https://cloudstudying.kr/lectures/267

 

① 필드의 다형성 : 필드 타입으로 인터페이스를 선언하면 필드값으로 다양한 객체를 대입할 수 있고, 이 객체마다 선언되어 있는 다양한 메소드를 호출할 수 있다. 따라서 기존 클래스의 메소드를 수정하지 않아도, 다양한 메소드의 실행결과를 얻을 수 있게 된다.

 

② 매개 변수의 다형성 : 매개 변수를 인터페이스 타입으로 선언하고 호출할 때에는 구현 객체를 대입한다. 매개 변수의 타입이 인터페이스일 경우 어떠한 구현 객체도 매개값으로 사용할 수 있고, 어떤 구현 객체가 제공되느냐에 따라 메소드의 실행결과는 다양해질 수 있다.

 

 

강제 타입 변환(Casting)

  • 구현 객체가 인터페이스 타입으로 자동 타입 변환하면, 인터페이스에 선언된 메소드만 사용 가능 하다는 제약이 있다.
  • 경우에 따라 구현 클래스에 선언된 필드와 메소드를 사용해야할 경우 강제 타입 변환을 사용한다.
  • 구현클래스 변수 = (구현클래스) 인터페이스 변수;

 

객체 타입 확인

  • 어떤 구현 객체가 인터페이스 타입으로 변환되었는지 확인하는 방법이다.
  • 상속과 마찬가지로 instatnceof 연산자를 사용한다.
  • 구현 객체가 인터페이스 타입으로 변환되어 있는 상태에서 가능하다.
  • 상속에서는 자식 클래스 타입인지, 인터페이스에서는 구현 클래스 타입인지를 확인할 때 사용한다.
  • 어떤 구현 객체가 변환되어 있는지 알 수 없는 상태에서 무작정 강제 타입 변환할 경우 ClassCastException이 발생할 수 있다.
  • 따라서 강제 타입 변환을 해야하는 경우 반드시 매개값이 어떤 객체인지 확인하고 안전하게 변환해야 한다.

 

인터페이스 상속

  • 인터페이스도 다른 인터페이스를 상속할 수 있다.
  • 다중 상속을 허용하지 않는 클래스와는 달리 다중 상속을 허용 한다. 즉, extends 뒤에 상위 인터페이스가 올 수 있다.
  • 하위 인터페이스를 구현하는 클래스는 하위 인터페이스의 메소드뿐만 아니라 상위 인터페이스의 모든 추상 메소드에 대한 실체 메소드를 가지고 있어야 한다.
  • 하위 인터페이스로 타입 변환이 되면 상위 및 하위 인터페이스에 선언된 모든 메소드를 사용할 수 있지만 상위 인터페이스로 타입 변환되면 상위 인터페이스에 선언되 메소드만 사용할 수 있다.

 

인터페이스 vs 클래스

 

https://www.geeksforgeeks.org/interfaces-in-java/?ref=gcse

 

 


참고자료:

https://cloudstudying.kr/lectures/267

 

15 인터페이스 | CloudStudying

# 인터페이스(interface) ## 들어가며 --- 홍팍이는 개발자다. 동시에 강사이며, 친구이다. 상황에 따라 다양한 역할을 수행한다. ![클라우드스터딩-자바-인터페이스-다형성](https://i.imgur.com/n8DKfTJ.png)

cloudstudying.kr

https://www.geeksforgeeks.org/interfaces-in-java/?ref=gcse

https://hyuntaekhong.github.io/blog/java-basic21/

https://velog.io/@mmy789/Java-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4-4

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

[26] JAVA 익명 객체 (Anonymous)  (0) 2022.12.10
[25] JAVA 중첩 클래스/ 중첩 인터페이스  (0) 2022.12.09
[23] JAVA 인터페이스  (0) 2022.12.04
[22] JAVA 추상클래스  (0) 2022.12.03
[21] JAVA 타입변환과 다형성  (1) 2022.12.02

+ Recent posts