기록

새싹체험_java_1029

coolcode 2022. 10. 29. 11:59

java 인터페이스 >> 개발자가 어떤 소스코드를 작성할 때 서로 호환성있고 일관성 있게 구현하기 위해 클래스에 대한 규격/틀을 제공하는 것  (다른 클래스를 작성할때 기본이 됨 / 추상 메서드의 집합)

> 인터페이스는 서로 통신하는 접점 역할을 하는데, 코드 작성시 인터페이스의 메서드를 호출하면 인터페이스는 객체의 메서드를 호출시키고 그에 대한 리턴값을 인터페이스를 통해 넘겨받음 (개발자는 객체의 내부 구조를 알 필요 없이 사용만 하면 됨)

인터페이스 선언은 class 키워드 대신 interface 키워드를 사용하고 public interface "인터페이스 이름" 형태로 선언함

인터페이스는 인스턴스 또는 정적 필드를 선언할 수 없음 / 하지만 상수 필드는 선언이 가능함 

interface Animal {
	public abstract void sound();
}
>> 인터페이스를 통해 호출된 메소드는 최종적으로 객체에서 실행됨
>> 따라서 인터페이스의 메서드는 실행블록이 필요없는 추상메서드로 선언함

구현 객체(인터페이스를 implements한 클래스) 

>> 구현객체는 인터페이스에서 정의된 추상 메서드에 대한 실체 메서드를 가지고 있어야 함(오버라이딩)/ 이러한 객체를 인터페이스의 구현객체라고 하고, 구현객체를 생성하는 클래스를 구현 클래스 라고 함 

>> 인터페이스를 구현하려면 구현 클래스 선언부에 implements 키워드를 추가하고 인터페이스 이름을 명시해야 함

구현클래스는 인터페이스에 선언된 추상 메서드의 실체 메서드를 선언해야 함

다중 인터페이스 구현 클래스 

자식클래스가 여러 부모 클래스를 상속 받을 수 있다면 다양한 동작을 수행할 수 있다는 장점이 있음/ 하지만 클래스를 사용하여 다중 상속을 할 경우 메서드 충돌 등의 문제가 있어서 자바에서는 클래스를 통한 다중 상속은 지원하지 않음

interface A {}
interface B {}

class C implements A, B{
	A,B 인터페이스에 선언된 추상 메서드를 오버라이딩 하여
    실체메서드를 작성해야 함
}

인터페이스 다형성 

인터페이스를 사용해서 메서드를 호출하도록 했다면 구현객체를 교체할 수 있음/ 프로그램 소스 코드는 변함이 없는데 구현객체를 교체함으로써 프로그램의 실행 결과가 다양해짐   

// 인터페이스의 다형성 최종 형태
Animal myAnimal = new Cat();
myAnimal = new Dog();

// Animal 인터페이스
interface Animal{
	void sound();
}

// Cat 클래스에서 Animal interface를 implements
class Cat implements Animals{
@Override
public void sound(){
		syso("야옹")
	}
}

// Cat 클래스에서 Animal interface를 implements
class Dog implements Animals{
@Override
public void sound(){
		syso("몽몽")
	}
}

인터페이스 자동타입 변환

구현객체가 인터페이스 타입으로 변환되는 것은 자동 타입 변환에 해당함

구현 클래스를 상속해서 자식클래스를 만들었다면 자식 객체 역시  인터페이스 타입으로 자동 타입변환할 수 있음

자동타입변환은 주로 메서드를 호출할 때 발생한다/ 매개변수를 인터페이스 타입으로 선언하고 호출할때  interface를 구현하고 있는 구현객체를 대입할 수 있음

// 자동타입변환
A a1 = new B();
A a2 = new C();
A a3 = new D();
A a4 = new E();

인터페이스 강제타입 변환

구현객체가 인터페이스 타입으로 자동 타입변환하면 인터페이스에 선언된 메서드만 사용됨/ 구현 클래스에 선언된 필드와 메서드를 사용해야 할 경우 강제 타입변환을 해서 다시 구현 클래스 타입으로 변환한 다음에 구현클래스의 필드와 메서드를 사용할 수 있음 

> 상속의 원리와 같음

 

String 클래스 

// 자주 사용하는 메서드

cahrAt(int index) :: 특정 위치의 문자를 리턴(리턴타입 char)
equals(Object anObject) :: 두 문자열을 비교(리턴타입 boolean)
length() :: 총 문자의 수를 리턴(리턴타입 int)

// 리턴타입 String
replace(CharSequence target, CharSequence replacement) :: target 부분을 replacement로 대체하여 리턴
substring(int beginIndex) :: beginIndex위치에서 끝까지 짤라낸 새로운 문자열을 리턴
substring(int beginIndex, int endIndex) :: beginIndex위치에서 endIndex전까지 짤라낸 새로운 문자열을 리턴
toLowerCase() :: 소문자로 변환한 새로운 문자열 리턴
toUpperCase() :: 대문자로 변환한 새로운 문자열 리턴
trim() :: 앞뒤 공백 제거한 새로운 문자열 리턴
valueOf(int i) :: 기본 타입값을 문자열로 리턴
valueOf(double d) :: 기본 타입값을 문자열로 리턴

** toLowerCase :: 문자열에 대문자를 소문자로 변환
** toUpperCase :: 문자열에 소문자를 대문자로 변환
** toString :: 문자열을 그대로 반환
** trim :: 문자열에 앞 뒤 공백을 없애주는 메서드 (중간 공백은 해당 아님)

 

회원가입시 아이디를 대문자로 입력했을때로 로그인이 되는 경우가 있기 때문에 유효성 검증시 필요

> 문자열도 하나하나 대소문자 구분을 하기 때문에 모두 대문자로 바꾸거나 소문자로 바꿔서 비교해줄 수 있음

 java.lang패키지는 별도 import 없이 사용 가능한 자바 프로그램의 기본 클래스를 담고 있는 패키지임

문자열을 기본타입으로 변환하는 메서드

String -> byte :: Byte.parseByte(str);
String -> short :: Short.parseShort(str);
String -> int :: Integer.parseInt(str);

// 이런 방식으로 기본타입으로의 변환이 가능함

String 메서드 실습

// toLowerCase :: 문자열에 대문자를 소문자로 변환
		String str1 = "abcDEF";
		System.out.println("toLowerCase :: " + str1.toLowerCase() );

		String str2 = "ABCdef";
		System.out.println("toUpperCase :: " + str1.toUpperCase() );
		
		// toString ::  문자열을 그대로 반환
		String str = "toString  eeee";
		System.out.println(str.toString());
		
		String str4 = "   TRIM  TEST E    ";
		System.out.println(str4);
		System.out.println(str4.trim());      
        
// console
toLowerCase :: abcdef
toUpperCase :: ABCDEF
toString  eeee
   TRIM  TEST E    
TRIM  TEST E

Wrapper 클래스 :: 자바는 기본타입의 값을 갖는 객체를 생성할 수 있음/ 이런 객체를 포장객체라고 하는데, 그렇게 부르는 이유는 기본 타입의 값을 내부에 두고 포장하기 때문

포장 객체의 설계도인 포장클래스는 java.lang 패키지에 포함되어 있는데 기본타입에 대응되는 클래스들이 있음

int > Integer 와  char > Character 를 제외하고는 모두 맨 앞글자가 대문자로 바뀐 형태

Boxing :: 기본타입의 값을 포장 객체로 만드는 과정을 박싱이라고 함 (자동박싱과 자동언박싱도 있음)

UnBoxing :: 박싱된 포장객체에서 다시 기본타입의 값을 얻어내기 위해서는 각 포장클래스마다 가지고 있는 '기본타입이름 + Value()' 메서드를 호출하면 됨

java의 내부 클래스 

Object :: 자바 최상위 클래스(자바의 모든 클래스는 Object 클래스를 상속받기 때문에 Object 클래스의 멤버를 모두 사용 할 수 있음)

Class :: 어떠한 클래스를 메모리로 로딩할 때 사용

 Wrapper :: 기본타입의 데이터를 갖는 객체를 만들때 사용/ 문자열을 기본타입으로 변환할때 사용/ 입력값 검수할 때 사용

object  클래스의 equals 메서드는 == 비교 연산자와 동일한 결과를 나타냄

string 클래스가 오브젝트이 equals 메서드를 재정의해서 번지 비교가 아닌 문자열 비교로 오버라이드 해서 재정의 했기 때문

**즉 object 클래스의 equals  메서드를 string 클래스가 오버라이드 해서 재정의 함

hashcode 메서드와 :: 객체 고유한 정수값 (객체마다 그 안에 있는 고유 정수갑을 가지고 있음) 

>> 객체 데이터가 같을 때는 같은 hashcode를 반환하도록 재정의 함

equals 메소드 :: 데이터가 같을때는 true를 반호나하도록 재정의 함

Object클래스의 toString >> 하위클래스가 가치있는 정보를 뽑아내도록 오버라이드 후 재정의

 

두 객체의 데이터가 같은지 다른지를 비교해야 할 때 사용되는 메서드가 equals() / hashcode() 메서드임

hashcode() > 객체마다 다른 고유의 해시코드 값 

자료구조에 넣을때는 같은 해시코드 값을 반환하도록 해주어야 함

동일한 객체로 판단되도록 해야하고 그때 필요한 메서드가  equals() / hashcode() 

System  클래스(정적으로 구성되어 있음 ) > 자바 프로그램은 운영체제에서 바로 실행되는 것이 아니라 jvm위에서 실행됨

> 따라서 운영체제의 모든기능을 직접 이용하기 어렵지만 이 클래스를 사용하면 운영체제의 일부 기능을  사용할 수 있음

ex)  long time = System.CurrentTimeMilise;

==================================================4교시 끝

// 난수를 얻을때 random클래스를 사용해도 되지만 (객체 생성시 종자값을 System.currentTimeMillis() 로 넣어주어야 함)
// 보통 간단한 난수는 Math클래스의 메서드를 이용함 

scanner 클래스 >> 여러 생성자를 받아서 화면/ 파일/ 문자열과 같은 입력 소스로부터 문자데이터를 읽어오는데 도움을 주기 위해 추가된 클래스

Arrays 클래스 >> 배열을 사용함에 있어서 편리함을 제공하는 클래스이고 Math클래스와 마찬가지로 static 메서드로 구성되어 있음

** Arrays 클래스의 copyOf() / copyOfRange() 메서드를 통해 보다 편리하게 배열 복사가 가능함

** Arrays 클래스의 sort() 매개변수로 전달받은 배열의 모든 요소를 오름차순으로 정렬해줌 

// Arrays 클래스는 배열을 쓰는데 있어서 편리한 기능을 제공해주는 클래스
		// Math 클래스와 마찬가지로 static 메소드들로 구성되어 클래스로 편하게 접근 가능함
		
		int[] arr = {1,2,3,4,5};
		String strArr = Arrays.toString(arr);
		
		int[] arr1 = Arrays.copyOf(arr, arr.length);
		int[] arr2 = Arrays.copyOf(arr, 8);
		int[] arr3 = Arrays.copyOf(arr, 3);
		// 복사할 배열의 인덱스 0부터 복사가 이루어짐 
		System.out.println(Arrays.toString(arr)); 
		System.out.println(Arrays.toString(arr2)); 
		System.out.println(Arrays.toString(arr3)); 
		
		int[] arr4 = Arrays.copyOfRange(arr, 2, 4);
		// indext 2부터 3까지 길이의 배열이 만들어지고 (4는 불포함)
		// indext 2부터 3까지 배열이 복사됨
		System.out.println();
		System.out.println(Arrays.toString(arr4));
		
		int[] arrTest = {3,4,6,1,5,2};
		Arrays.sort(arrTest); 
		System.out.println(Arrays.toString(arrTest));
        
  // console 
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5, 0, 0, 0]
[1, 2, 3]

[3, 4]
[1, 2, 3, 4, 5, 6]

 

utill 패키지에 있는 Calender 클래스와 Date 클래스

calender 클래스는 추상클래스 이므로 getInstance()메서드를 이용해서 객체를 얻는 형태로 객체를 사용할 수 있음 

Date now = new Date(); 
		// 현재시스템의 시간으로 객체를 생성하며 그 외는 잘 사용하지 않음
		// SimpleDateFormat 클래스
		
		SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd");
		SimpleDateFormat format2 = new SimpleDateFormat("a hh:mm:ss");
		// 객체를 생성할때 문자열로 포맷형식을 지정할 수 있음
		// 연도는 yyyy 월은 MM 일자는 dd
		// 시간 hh: 분mm 초ss
		
		String date = format.format(now);
		String time = format2.format(now);
		
		System.out.println(date);
		System.out.println(time);
		
		// 자바 초기에는 date 클래스를 사용했지만 윤년과 같은 경우를 보안하기 위해
		// Calender 클래스라는 추상클래스가 나옴 (getInstance 메서드를 호출해서 객체를 가져옴)
		
		Calendar calendar = Calendar.getInstance();
		int year = calendar.get(Calendar.YEAR);  
		int month =calendar.get(Calendar.MONTH) + 1;
		int day =calendar.get(Calendar.DAY_OF_MONTH);
		// 사람의 월은 1월 부터 ~ 12월 까지 이지만
		// 컴퓨터의 월은 0부터 시작하기 때문에 사람의 기준에 맞추기 위해 +1을 해주어야 함
		
		System.out.printf("오늘의 날짜는 %d년 %d월 %d일 \n",  year, month, day);
		
		calendar.get(Calendar.HOUR); // 12시간제
		int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24시간제

**오늘 기본적인 api 클래스를 알아보았고 내일은 컬렉션이랑 예외처리 IO까지 해서 수업 마무리 예정 

==================================================5교시 끝