새싹체험_java_1029
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교시 끝