• 티스토리 홈
  • 프로필사진
    Song hyun
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
Song hyun
  • 프로필사진
    Song hyun
    • 분류 전체보기 (780)
      • 백준 (0)
      • 일본어 (0)
        • 모모타로TMC (0)
      • 영어 (2)
        • Diary (0)
        • Toast Masters (2)
      • 메모 (13)
      • 설치 메뉴얼 (30)
      • Java (178)
      • MySQL (60)
      • JSP (67)
      • Springboot (46)
      • HTML,CSS, JS (71)
        • HTML (8)
        • CSS (12)
        • JavaScript (37)
        • HTML&CSS 스터디 (13)
      • C++ (7)
      • Linux (7)
      • JPA (34)
      • Kotlin (2)
      • Flutter (42)
      • Error Note (39)
      • 디자인 패턴 (12)
      • 디지털논리회로 (4)
      • 데이터베이스 시스템 (8)
      • 알고리즘 (7)
      • 운영체제 (3)
      • 이산수학 (3)
      • 인공지능 (1)
      • 자료 구조 (14)
        • 기본 개념 (14)
        • 자료구조 스터디 (0)
      • 💡My project (76)
        • 팩맨 : Java Swing 게임 제작 프로젝트 (6)
        • 네이트톡 : Java 소켓 통신 프로젝트 (4)
        • 포켓옥션 : HikariCP&JDBC CRUD 프.. (3)
        • 이지 부산 : BDIA-Devton 2024 프로.. (20)
        • 그린 유니버시티 : JSP를 사용한 학사관리 프로.. (1)
        • 애드 포커 : 웹 소켓과 Spring을 사용한 카.. (1)
        • 셸위 : 게임 친구 매칭 사이트 (21)
        • 다모아 : 개발자 중개 플랫폼 (20)
      • 📗스터디 (13)
        • CNN : 웹개발 스터디 (10)
        • Node&React로 유튜브 사이트 만들기 (3)
      • 📙독서 및 강연 기록 (36)
        • 강연 (14)
        • 독서 (22)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Java] 101. 제네릭 Generic
        2024년 06월 03일
        • Song hyun
        • 작성자
        • 2024.06.03.:24
        728x90
        반응형

        [Java] 101. 제네릭 Generic

        1. 제네릭이란?

        2. T extends 문법

        3. 시나리오 코드


        1. 제네릭이란?

        (1) 제네릭(Generic): 제네릭은 무엇이든 담을 수 있다. (from JAVA ver 5.0~)

        (2) 제네릭은 클래스에서 사용하는 변수의 자료형이 여러개이고, 그 기능(메서드)은 동일할 때, 클래스의 자료형을 특정하지 않고 추후 

        (2) 우리가 변수를 사용할 때, 항상 자료형을 먼저 선언하게 된다. 이 때, 변수의 이름은 같지만 자료형(데이터 타입)이 다를 때 제네릭을 사용하게 된다.


        2. T-extends 문법

        (1) 제네릭을 사용해 코드를 작성할 경우, 다양한 자료형을 사용할 수 있다는 장점이 있다. 하지만 상정 외의 자료형이 들어갈 수도 있다는 단점이 존재한다.

        (2) 그래서 사용자가 정의한 자료형만 사용할 수 있도록, 제네릭과 함께 상속(Extends) 기법을 사용한다.

         

         

        -GenenericPrinter

        더보기
        package ch03;
        
        // Material을 상속받은 하위 자식 클래스만
        // 대체 문자에 들어올 수 있다.
        public class GenericPrinter<T extends Material> {
        	
        	private T material;
        	
        	public T getMaterial() {
        		return material;
        	}
        	
        	public void setMaterial(T material) {
        		this.material=material;
        	}
        	
        	@Override
        	public String toString() {
        		return material.toString();
        	}
        }

        -Material

        더보기
        package ch03;
        
        // 직접 객체를 사용할 수 없게, 강제성을 부여(추상 클래스)
        public abstract class Material {
        
        	public abstract void doPrinting();
        	
        }

        -Plastic/Powder

        더보기
        package ch03;
        
        /*
         * T extends 클래스 문법을 사용하기 위해 설계
         */
        
        public class Plastic extends Material {
        
        	@Override
        	public String toString() {
        		return "재료는 플라스틱입니다.";
        	}
        	
        	@Override
        	public void doPrinting() {
        		System.out.println("플라스틱 재료로 출력합니다.");
        		
        	} 
        
        }
        package ch03;
        
        /*
         * T extends 클래스 문법을 사용하기 위해 설계
         */
        
        public class Powder extends Material {
        
        	@Override
        	public String toString() {
        		return "재료는 파우더입니다.";
        	}
        	
        	@Override
        	public void doPrinting() {
        		System.out.println("파우더 재료로 출력합니다.");
        		
        	} 
        
        }

        -MainTest

        더보기
        package ch03;
        
        public class MainTest3 {
        	
        	public static void main(String[] args) {
        		
        		// <T extends 클래스> 사용하기 
        		
        		// 상위 클래스의 필요성
        		// T 자료형은 범위를 제한할 수 없음
        		// 위 문법을 사용해, 상위 클래스에 속한 자료형만 대체 문자 안에 들어올 수 있다!
        		
        		GenericPrinter<Powder> genericPrinter1=new GenericPrinter<>();
        		genericPrinter1.setMaterial(new Powder());
        		System.out.println(genericPrinter1.toString());
        		
        		//////////////////////////////////
        		// 컴파일 시점에서부터 오류가 생한다.
        		// GenericPrinter<Water> genericPrinter2=new GenericPrinter<>();
        	}
        
        }

        3.시나리오 코드

        -ch01

        더보기
        package ch01;
        
        public class ThreeDPrinter {
        	Plastic material;
        	
        	// get,set
        	public Plastic getMaterial() {
        		return material;
        	}
        	
        	public void setMaterial(Plastic material) {
        		this.material=material;
        	}
        }
        package ch01;
        
        public class Plastic {
        	
        	@Override
        	public String toString() {
        		return "재료는 플라스틱 입니다.";
        	}
        
        }
        package ch01;
        
        public class Powder {
        
        	@Override
        	public String toString() {
        		return "재료는 파우더 입니다.";
        	}
        }

         

        -ch02

        더보기
        package ch02;
        
        public class GenericPrinter<T> {
        
        	// T라는 대체 문자를 사용, 
        	// E - Elements
        	// K - Key
        	// V - Value 라는 의미로 대체 문자를 사용하기도 한다.
        	// 사실은 어떤 문자든 관계 없다.
        	// 자료형 매개변수(type parameter) 
        	
        	// 이 클래스를 사용하는 시점에서 실제 사용될 자료형이 결정된다.
        	
        	private T material; // T 대체 문자로형으로 변수를 선언
        	public T getMaterial() {
        		return material;
        	}
        	public void setMaterial(T material) {
        		this.material=material;
        	}
        	
        	// GenericPrinter<T> -- 참조 변수를 sysout(참조변수)
        	// --> 나의 멤버 material에 toString()
        	@Override
        	public String toString() {
        		return material.toString();
        	}
        	
        }
        package ch02;
        
        import ch01.Plastic;
        import ch01.Powder;
        
        public class MainTest02 {
        	
        	public static void main(String[] args) {
        		
        		// 재료 선언
        		Plastic plastic01 = new Plastic();
        		Powder powder01 = new Powder();
        		
        		// 사용하는 시점에 T 대신 어떤 자료형을 사용할지 지정하면 된다.
        		GenericPrinter<Plastic> genericPrinter1 = new GenericPrinter<>();
        		genericPrinter1.setMaterial(plastic01); // 메서드 의존 주입
        		
        		// 최상위 Object 를 활용할 때와 비교해보면
        		// 1. 다운캐스팅을 할 필요가 없다.
        		Plastic returnPlastic=genericPrinter1.getMaterial();
        		System.out.println(returnPlastic);
        		
        		// 2. 컴파일 시점에서 오류를 알려주기 때문에, 안정적인 코드 작업이 진행된다.
        		// Powder returnPowder=genericPrinter1.getMaterial();
        	} // end of main
        
        }

         

        728x90
        반응형

        'Java' 카테고리의 다른 글

        [Java] 103. 순수 자바 코드로 HTTP 서버 만들기  (0) 2024.06.03
        [Java] 102. 소켓을 활용한 HTTP 통신  (0) 2024.06.03
        [Java] 100. 네트워크 프로토콜  (0) 2024.05.24
        [Java] 99. 1:N 양방향 통신  (0) 2024.05.24
        [Java] 98. 코드 리팩토링(1:1 양방향 통신-클라이언트 측)  (0) 2024.05.23
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바