관리 메뉴

거니의 velog

230801 자바 강의 본문

대덕인재개발원_Java

230801 자바 강의

Unlimited00 2023. 8. 1. 13:59

[ClassExample.java]

package ddit.chap11.clazz;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.lang.reflect.Method;

import ddit.chap11.object.ObjectExample02;
import ddit.chap11.ex01.Student;

public class ClassExample {

	public static void main(String[] args) throws Exception {
		
		// 자바에서 사용되는 모든 class 와 interface 들의 일반적 정보
		// class가 왜 필요?
		// 그냥 java 파일로 제공되면 읽으면 되지만, compile 되는 순간 유니코드로 바뀌어 우리가 읽을 수 없는 class 파일로 변환.
		// 이 내용을 알아야 겠다고 해서 그 안에 멤버 필드나 생성자가 뭔지, 매개 변수가 뭔지에 대한 정보를 하나씩 꺼내올 수 있는 것이 class.
		// 디컴파일러와 비슷한 정보를 제공한다.
		
		// reflect. 네트워크에서 많이 활용됨.
		// 불특정한 정보를 얻고자 할 때, 클래스의 구조나 구성요소를 조금씩 알 필요가 있는 경우에 사용.
		
		Class c1 = Member.class;
		Class c2 = Byte.class;
		Class c3 = ClassExample.class;
		Class c4 = ObjectExample02.class;
		Class c5 = Class.forName("ddit.chap11.ex01.Student");
		
		// getName(); 클래스명(패키지 경로 포함) 확인
		System.out.println(c3.getName()); // ddit.chap11.clazz.ClassExample
		System.out.println(c4.getName()); // ddit.chap11.object.ObjectExample02
		
		// getSimpleName(); : 패키지 경로 미포함된 클래스명 확인
		System.out.println(c3.getSimpleName()); // ClassExample
		System.out.println(c4.getSimpleName()); // ObjectExample02

		// getPackage(); : 패키지 경로만 출력
		System.out.println(c3.getPackage()); // package ddit.chap11.clazz
		System.out.println(c4.getPackage()); // package ddit.chap11.object
		
		// getConstructors() : 생성자 메서드 정보반환 ->
		//                     Constructor 클래스 타입의 배열로 반환
		Constructor[] constructors = c2.getConstructors();
		Method[] methods = c5.getMethods(); // public 메서드만 반환
		Method[] methodInheritence = c5.getDeclaredMethods(); // 상속받은 메서드만 반환
		Field[] fields = c5.getFields(); // public 필드만 반환
		Field[] fieldInheritence = c5.getDeclaredFields(); // 상속받은 필드만 반환
		
		for(Constructor c : constructors) {
			System.out.println("생성자 : " + c);
		}
		
		for(Method m : methods) {
			System.out.println("public 메서드 : " + m);
		}
		
		for(Method m : methodInheritence) {
			System.out.println("상속받은 메서드 : " + m);
		}
		
		for(Field f : fields) {
			System.out.println("public 필드 : " + f);
			System.out.println("public 필드명 : " + f.getName());
			System.out.println("public 필드타입 : " + f.getType());
		}
		
		for(Field f : fieldInheritence) {
			System.out.println("상속받은 필드 : " + f);
		}
		
	}

}


SELECT MEM_NAME AS "회원명"
     , GREATEST(1000, MEM_MILEAGE) AS "변경마일리지"
     , MEM_MILEAGE AS "원본마일리지"
  FROM MEMBER;

[MathExample.java]

package ddit.chap11.math;

import java.util.Arrays;

public class MathExample {

	public static void main(String[] args) {
		
		// 수학적 기능을 수행하는 메서드 제공 - random()
		// max(val1, val2) : 두 매개변수(val1, val2) 중 큰 값을 반환
		// 10명의 마일리지를 배열에 저장한 후, 그 값이 1000 미만이면 1000을 부여하시오.
		// 자료 : 1000, 2300, 3500, 700, 6500, 2700, 800, 1500, 900, 1100
		
		int[] mileage = {1000, 2300, 3500, 700, 6500, 2700, 800, 1500, 900, 1100};
		System.out.println("원본    마일리지 : " + Arrays.toString(mileage));
		
		for(int i=0; i<mileage.length; i++) {
			mileage[i] = Math.max(1000, mileage[i]);
		}
		System.out.println("변경된 마일리지 : " + Arrays.toString(mileage));
		
//		원본    마일리지 : [1000, 2300, 3500, 700,  6500, 2700, 800,  1500, 900,  1100]
//		변경된 마일리지 : [1000, 2300, 3500, 1000, 6500, 2700, 1000, 1500, 1000, 1100]
		
	}

}


[StringExample.java]

package ddit.chap11.string;

public class StringExample {

	public static void main(String[] args) {
		
		// String class : 불변(immutable)의 문자열 자료 취급.
		// 변경하다? "김지호" + "멋있다" => "김지호 멋있다"? 불가능.
		// str1 = "대한민국"; + str2 = "대전시" ? 
		// 변수 메모리를 call stack, literal fool에서 따로 가지고, 새로 합쳐진 문자열이 새로운 메모리로 추가됨. 기억 장소가 많이 낭비됨.
		
		// 특히 쿼리문 작성시 기억 장소를 많이 사용하는 폐해가 있으므로 
		// StringBuffer, StringBuilder. 이 둘은 mutable. 메모리 뒤에 문자가 계속 추가되고, 메모리 기억 공간은 하나만 배정됨.
		
		// 1. 부분 문자열 추출. substring(int stattidx, int endidx(endidx - 1까지 반환));
		// ex ) str = "무궁화_꽃이_피었습니다."; => str.substring(0, 5); => 무궁화_꽃(5-1=4번째 문자)
		// str.substring(0, str.length - 2);
		// 업데이트 쿼리 수행시 set 절이 다양한 파라미터로 변경되는 경우가 많다.
		// 어떻게 구현? 
		// 4가지 변경 사항을 수정할 수 있는 set 절은 다 구현하되, 변경사항을 물어보고, 아니면 밖으로 수행.
		// 문제는 컴마가 붙는데, 마지막 컴마는 떼야 한다. 그 때 substring 사용.
		
		String str = "무궁화 꽃이 피었습니다.";
		System.out.println(str.substring(0, str.length()-1)); // 무궁화 꽃이 피었습니다 => 마침표 제거.
		System.out.println(str.substring(0, 6)); // 무궁화 꽃이
		
		// 기본 타입 => 문자열로 변환
		// String.valueOf(기본 타입 데이터);
		// 기본 타입 데이터 + "";
		int num = 1001;
		String numStr = String.valueOf(num);
		System.out.println(numStr + 99); // 100199
		System.out.println(num + "" + 99); // 100199
		
		// 문자열 => 기본 타입으로 변환
		// Wrapper.parse기본타입(문자열);
		String flag1 = "true";
		boolean flag = Boolean.parseBoolean(flag1);
		System.out.println(!flag); // false
		
	}

}


[StringBuilderExample.java]

package ddit.chap11.string;

// 긴 문자열 결합연산이나 반복되는 문자열 결합연산에 사용
// StringBuffer - thread safe
// StringBuilder - 일반적인 문자열 결합연산에 효율적
// 결론 : 일반적으로 결합연산이 많이 일어나지 않으면 String
//       결합연산이 빈번히 발생되거나, 긴 문자열 결합이 빈번하면 StringBuilder
//       스레드 처리 내에서 문자열 결합 연산을 효율적이고 안정적으로 하기 위해서는 StringBuffer
// 생성자 메서드를 제외하고 나머지 메서드는 동일하다.

// StringBuilder의 주요 메서드
// 1. 생성자
// StringBuilder([int capacity]-생략가능. 16이 default.) : capacity-버퍼 사이즈
// 2. append(데이터) : 기존의 문자열 끝에 '데이터'를 추가하여 저장.
// 3. insert(int offset, String str) : 기본 위치에서 내가 저장하고 싶은 위치가 떨어진 정도(offset)
//    str = "대한민국대전시"; insert(4, 오룡); 5번째 위치 다음에 "오룡"을 집어 넣어라.
//          "대한민국오룡대전시"
// 4. replace(int index1, int index2, String str) : index1부터 index2-1까지 문자열을 str로 바꿔준다.
// 5. toString() : String 타입으로 변환. equals() 메서드를 사용하기 위해.

public class StringBuilderExample {

	public static void main(String[] args) {
		
		StringBuilder sb = new StringBuilder();
		sb.append(" select mem_id, mem_name, mem_hp, mem_mileage \n");
		sb.append("   from member \n");
		sb.append("  where mem_regno1 like '0%' ");
		String sql = sb.toString(); // 문자열로 바꿈.
		
		System.out.println(sql);
		
		StringBuilder str = new StringBuilder("대한민국대전시");
		str.insert(4, "오룡");
		System.out.println(str.toString()); // 대한민국오룡대전시
		
		str.replace(4, 6, "계룡");
		System.out.println(str.toString()); // 대한민국계룡대전시
		
		str.replace(4, 9, "계룡");
		System.out.println(str.toString()); // 대한민국계룡
		
	}

}


[컬렉션 프레임워크]

자료구조

데이터 저장 방법 중에 가장 널리 사용되는 3가지 방법
(1) List
(2) Set
(3) Map

List : 1차원 배열 구조. index가 부여됨. 순번 값으로 배열에 저장된 값을 구별할 수 있다. 저장된 데이터가 2개 저장되도 상관이 없다.
, 순서화되어 있고, 중복이 허용된다.

Set : 집합. 순서화되어 있지 않다. 중복을 허용하지 않는다. 구분자가 저장된 데이터 값이기 때문.
, 순서화되어 있지 않고, 중복을 허용하지 않는다.
새로운 값이 기존 값과 중복되면 새로운 값으로 덮어쓰기 된다.
Set 류의 데이터를 저장하기 위해 어떤 메소드 선행? 그 안에 똑같은 데이터가 있는지를 확인해야 함. equals(), hash()...
데이터 값이 같고 같은 객체가 되려면 주소도 같아야 한다. 내용과 주소를 같이 비교해야 하는 이유.

Map : <Key, Value> 쌍으로 저장됨.
Key는 중복을 허용하지 않는다. 오라클의 PK와 같음. Not Null, No Duplicate.
ValueKey에 매칭된 주소에 저장될 값들.
해쉬 테이블이라고 함. 그 안에 주소 계산에 사용되는 함수를 hashing. 자바에서는 오브젝트 클래스가 제공하는 hashcode() 메서드.

여기까지는 Interface. 이들의 조상 인터페이스 중 Iterable. Map은 아님.
Iterable? 그 안에 포함된 메서드가 Iterator. 반복자. 배열과 컬렉션 프레임워크의 맨 처음과 맨 마지막까지 검색하는 메서드. 전체 검색시 유용.

List를 구현해서 객체가 되어질 수 있는 클래스?
ArrayList, Vector, Stack, LinkedList...
거의 ArrayList를 많이 쓴다. 배열처럼 생긴 리스트. 배열 안에는 객체만 저장 가능. 객체가 아닌 녀석은 저장 불가. Wrapper 클래스가 만들어진 이유? 객체로 만들어서 ArrayList에 넣으려고. 객체는 연산의 대상이 되지 않는다.
꺼낼 때는 객체 상태로 그대로 나옴. 이 녀석들 연산하려면? 언박싱. 자바 1.5 이하일 때는 일일이 박싱과 언박싱을 개발자가 해야 했다. 지금은 컴파일러가 자동으로 해줌. 사용자는 관심도 없다. 자동으로 되는 박싱과 언박싱을 오토박싱-오토언박싱이라 한다.
ArrayList는 데이터 저장시 저장공간 확보. 저장하는 명령이 중요. 저장할 때 사용되는 메서드가 add(Object obj); 데이터를 ArrayList에 차례대로 저장되며 인덱스 부여. 오토박싱.
꺼내오는 것은 get(int index); 순번을 정해주면 순번에 해당되는 것이 꺼내져서 Object 타입으로 나옴. 이 때 발생하는 것이 오토언박싱.

Map에서 가장 많이 사용되는 것이 HashMap.
put(K,V); - 데이터 입력.
하나씩은 못 꺼냄. getKey, getValue. 주로 Set으로 변환하여 처리.

객체라면 모두가 컬렉션 프레임워크에 저장됨. 언뜻 보면 효율적인 것으로 보이나, 조심.
박싱-언박싱이 처리가 많이 걸림.
입력받는 값을 제한하는 것이 제네릭 <>.


[제네릭]

JCF에 저장되는 데이터 타입을 제한.

장점 : 입력되는 데이터를 검증할 수 있다.
출력 시에 캐스트 연산자가 필요 없다. 형변환을 하지 않아도 된다.

사용 방법 : <타입, 타입...>
컬렉션 객체<타입> 변수 = new 컬렉션 클래스명<타입>();


[ArrayListExample.java]

package ddit.chap13.arraylist;

import java.util.ArrayList;

public class ArrayListExample {
	
	ArrayList list = new ArrayList();
	
	public static void main(String[] args) {
		ArrayListExample arrayList = new ArrayListExample();
		arrayList.addData();
	}
	
	public void addData() {
		list.add(100);
		list.add("홍길순");
		list.add(false);
		list.add(12.5);
		
//		System.out.println(list); // [100, 홍길순, false, 12.5]
		
		for(int i=0; i<list.size(); i++) {
			System.out.println(list.get(i)); // 데이터를 하나씩 꺼내옴.
		}
	}
	
}


[ArrayListExample02.java]

package ddit.chap13.arraylist;

import java.util.ArrayList;
import java.util.Iterator;

public class ArrayListExample02 {

	public static void main(String[] args) {
		
		ArrayList<Employees> list = new ArrayList<Employees>(); // 제네릭으로 들어갈 데이터 타입을 Employees 객체로 제한함.
		
		list.add(new Employees("10101", "홍길동", 15000));
		list.add(new Employees("22102", "이길동", 25000));
		list.add(new Employees("10191", "정몽주", 10500));
		list.add(new Employees("13103", "이순신", 20000));
		list.add(new Employees("10105", "윤길동", 35000));
		
		System.out.println(list); 
		// Employees 클래스에 재정의된 toString()이 eName만 반환.
		// [홍길동, 이길동, 정몽주, 이순신, 윤길동]
		
		System.out.println("==============================");
		
		for(Employees emp : list) {
			System.out.println(emp.eID + " " + emp.eName + " " + emp.salary);
		}
		
		System.out.println("==============================");
		
//		Iterator iter = list.iterator();
		Iterator<Employees> iter = list.iterator();
		
		while(iter.hasNext()) { // iter.hasNext() : 더이상 꺼낼 데이터가 없으면 자동으로 false로 바뀌면서 while문 중단.
			
//			Employees emp = (Employees) iter.next(); // Iterator iter 변수에서 <Employees> 을 명시하지 않으면 (Employees)으로 다운 캐스팅 해야 한다.
			Employees emp = iter.next();
//			System.out.println(emp.eID + " " + emp.eName + " " + emp.salary);
			
			if(emp.eID.equals("10191")) {
				System.out.println(emp.eID + " " + emp.eName + " " + emp.salary);
			}
			
		}
		
	}

}

 

'대덕인재개발원_Java' 카테고리의 다른 글

230803 자바 강의  (0) 2023.08.03
230802 자바 강의  (0) 2023.08.02
230731 자바 강의  (0) 2023.07.31
230729 자바 과제 _ 클래스 다이어그램 구현  (0) 2023.07.29
230728 자바 강의  (0) 2023.07.29