[2023.10.23] 개발자 교육 21일 차 : 강의-복습, 제네릭, 리스트 [구디 아카데미]

DaramGee·2023년 10월 23일
0

오늘 정리

서비스 관점으로 코드를 설계? 프로그램의 핵심 기능, 요구사항에 집중하여 가독성, 유지보수, 재사용성 등을 고려하여 설계하는 것이다.

제네릭을 다양하게 사용? 추후 JASON을 통한 데이터 교환 시 용이하게 사용된다.

복습

  • 서비스관점
    • List → 인스턴스화? 생성(생성자), 초기화(null), 구현체 클래스
      • 제네릭에 원시형 타입은 오지 못 함 (Elements (=Object가 들어가기 때문)

        public class AMain {
        	//왜 <int>는 못오나? 원시형타입은 제네릭에 오지 못 하니 int의 wrapper 클래스 integer가 옴 
        	List<Integer> nums = new ArrayList<>(); 
        	public static void main(String[] args) {
        	}
      • 메소드

        • boolean(조건문, 반복문) add(E → elements, object, parameter - 제네릭)
  • 인스턴스화, 초기화
    • 생성자(메소드 오버로딩 가능, 호출하는 생성자에 따라 값이 다름)

      class B{
      	//왜 <int>는 못오나? 원시형타입은 제네릭에 오지 못 하니 int의 wrapper 클래스 integer가 옴 
      	/*선언부 - 생성자가 호출할 때 생성됨 */
      	List<Integer> nums = new ArrayList<>(); 
      	int ival;
      	String s = null;
      	String s1 = new String();
      	
      	
      	/*생성자 메소드 오버로딩 - 파라미터 타입이나 갯수가 다르다. */
      	public B() {
      	}
      	public B(int ival) {
      		s = new String("나초보");
      	}
      }
      /*메인메소드*/
      public class BMain {
      	public static void main(String[] args) {
      		System.out.println("main 호출"); //A클래스의 전변은 읽혀졌을까?  -> A클래스를 인스턴스화(선언)해야 사용 가능 
      		B b = new B();
      		try {
      			System.out.println(b.s.length()); //null에러
      		} catch (Exception e) {
      			System.out.println("NullPointerException 발생, 디폴트 생성자에서 s값을 초기화해주지 않아서 값이 없음 ");
      		}
      		b = new B(1);
      		System.out.println(b.s.length()); //3
      	}
      }

제네릭<>을 사용한다는 건 주소 번지를 두 번 접근해야 값에 도달한다. 제네릭은 직관적 사용을 위해 반드시 정한다.

  • 컬렉션 프레임워크 → 제네릭 사용
  1. List [ ] , 로우가 여러개 (Map { } 컬럼)
    1. 메소드(각 상황에 따라 선택하여 사용하기 때문에 메소드 구현 시 리턴타입이나 파라미터값에 대해 신중히 API를 확인야 함.) for 안전한 코드 작성
    • add 추가
      • void add(int, element) -> 선택된 순서로 추가함, 리턴타입이 void여서 대입연산자로 받을 수 없음.(후처리x)
      • boolean isOk = add(E e) -> true일때 "성공", false일때 "실패" 등 응답 처리 결과 출력 가능(후처리o)
        • 담당자 입장에서 화면과 로직이 분리된 상태여서 처리여부를 확인하는 것이 필요한 상황이 多
        • 왜 전변에서 false로 선언?
          • 플래그(flag) 역할을 하고 있기 때문이고, 처리결과 true일 때 변하도록 해 두는 기본 설정임.
      • E set(int index, E element) → 선택된 순서의 값 덮어쓰기
      • (add로 하면 사이즈 추가, set으로 하면 사이즈 유지)
    • 검색
      • boolean contains(Object o)
      • E get(int index)
      • boolean isEmpty()
      • int size()
    • 구현체 클래스
      • ArrayList : 싱글스레드 안
      • Vector : 멀티스레드 안전
    • List의 제네릭
      • -> -> 로 변함
        • type parameter(개발자 자유도 높이기 위해 제네릭 값 변천)

        • 제네릭 자료형 매개변수 T : 이 클래스를 사용되는 시점에서 실제 사용할 자료형이 결정된다. (컴파일 타임에 JVM이 바꿔치기를 해준다.

        • 단, Static 변수는 사용 불가능함 - 약속 - 컨벤션

          public class GenericMaterial<T> {
          	/*선언부*/
          	private T material;
          
          	/*정의메소드*/
          	public T getMaterial() {
          		return material;
          	}
          	public void setMaterial(T material) {
          		this.material = material;
          	}
          }
      • 제네릭 활용시?

        • 메소드 오버라이딩
          • toString() → 주소번지가 출력되는 Object의 메소드
            • UI 솔루션을 사용하여 자바 연동시 인터페이스 되는 부분을 toString() 재정의(오버라이딩)하여 사용할 수 있음.

              public class Plastic extends Object{
              	@Override
              	public String toString() {
              		return "나는 플라스틱입니다.";
              	}
              }
              public class MaterialTest {
              
              	public static void main(String[] args) {
              		Plastic p = new Plastic();
              		//(오버라이딩 전)원래는 주소번지를 출력하던 toStirn()메소드
              		//플라스틱 클래스에서 메소드 오버라이딩으로 재정의되어서 그곳에서 정해진 출력값이 나오는 메소드가 됨. 
              		//UI 솔루션을 사용하여 자바 연동시 인터페이스 되는 부분을 toString()재정의하여 사용할 수 있음. 
              		System.out.println(p);                   
              		System.out.println(p.toString());             //정해진 값 "나는 플라스특입니다."로 출력
              		MaterialTest mt = new MaterialTest();
              		System.out.println(mt);                         //주소번지로 출력
              	}
              }

        강의 마무리

        • 제네릭을 List로 연습 나중에는 VO, Map까지 활용하여 자유롭게 사용 가능해야 함. (JSON형식에 사전 준비 작업) List -> JSON, JSON -> List , List바꾸어 쓸 수 있다.

0개의 댓글