언어 공부 내용 정리/Java

객지프 기말대비 정리 (6장)

wosrn 2023. 7. 16. 23:55

<Object 클래스>

  • java.lang 패키지에 속한 클래스
  • 모든 클래스는 강제로 object 클래스를 상속받음
  • 자바 클래스 계층구조의 최상위 클래스

object클래스의 주요 메소드는 다음과 같다

boolean equals(Object obj)obj가 가리키는 객체와 현재 객체 비교
Class getClass()현 객체의 런타임 클래스 리턴
int hashCode()현 객체의 해시코드값 리턴
String toString()현 객체에 대한 문자열표현을 리턴(객체를 문자열로 변환)
  • 레퍼런스가 가리키는 객체의 클래스명 알고싶을땐 레퍼런스명.getClass().getName()
  • String toStirng() : 각 클래스는 이 메소드를 오버라이딩하여 자신만의 문자열을 리턴할 수 있다

//풀었던 족보 문제 (전화기) - getclass.getname으로 풀어도 될듯? if문 순서 고려 안해도 될듯
 
 
<객체를 문자열로 변환 : toString() >

  • 개발자는 object의 toString()을 오버라이딩, 즉 자신만의 toString() 을 작성하여 사용한다

toString 의 리턴값을 자신이 원하는 형식으로 오버라이딩 해두면(출력문 가로 안에 쓸때랑 똑같이 쓰면 되는듯) p.toString 으로 호출하지 않아도 p나 p+문자열 (객체 / 객체+문자열)을 호출할 때 자동으로 tostring으로 변환된다
 
<equals>

  • == 연산자로 객체를 비교하면 객체의 레퍼런스를 비교하고 (내용이 같아도 가리키는 객체가 다른 객체면 다르다고 판단) eqauls() 로 비교하면 내용을 비교한다 => 문자열 비교에는 equals() 사용한다
  • 단순 문자열 비교가 아닌 두 객체가 같은 내용인지 아닌지 판단할 때는(객체가 언제 같은건지에 대한 기준을 설정해주어야 할 때)  eqauls()를 오버라이딩하여 사용한다

1) 인자로 받은 obj를 point 형으로 형변환 - 이건 굳이? 싶긴 하다
2)equals() 의 리턴타입은 boolean
3)함수 사용 시에 객체. 으로 호출하여 쓸거기 때문에 if문 안에 그냥 x라고 써주면 됨(point 객체는 x,y멤버를 갖고있을거니까)
 
 
//6-4 풀기
 
 
<wrapper 클래스> : wrapper 객체 생성, wrapper 객체의 기본타입 값 알아내기 , 문자열을 기본타입으로 변환하기, 기본타입을 문자열로 변환하기, wrapper 객체의 값을 기본타입 변수에 대입하기

  • 기본타입을 객체로 다루기 위해 클래스화한 8개의 클래스를 wrapper 클래스라고 한다

<wrappe 객체 생성 : valueOf() >

  • 객체 생성 시엔 valueof 사용하여 가로 안의 값을 객체로 생성
  • 위의 방법 외에 문자열 안의 값을 객체로 만들 수도 있다 (character 제외)
  • float 객체는 기본형 중 double 타입의 값으로도 생성이 가능하다
  • wrapper클래스명 변수명 = wrapper클래스명.valueof( 기본타입 값 or 문자열) 의 형식으로 객체를 생성한다

 
<wrappper클래스 중 Integer 클래스의 주요 메소드>
*valueOf는 래퍼객체를 리턴하는 거임 ! 일반형 변수에 대입할 때 말고 객체 생성시에만 쓰는게 맞을듯
# 기본형 타입의 값으로 wrapper 객체 생성하기 -> (래퍼클래스) (객체레퍼런스변수명) = 래퍼클래스.valueOf(기본형값) 
# wrapper 객체의 값을 다른 기본형 변수에 넣기 -> 문자열 ! (parse는 문자열만,valueof는 기본형과 문자열만 지원)
-> 기본자료형이름 변수명 = 기본자료형의래퍼클래스.parse자료형(객체명.toString()) 
# wrapper 객체의 값을 String 형 변수에 넣기 -> String s = 객체명.toString()
# String 형 변수의 값을 다른 일반형 변수에 넣기
-> 기본자료형이름 변수명 = 기본자료형의래퍼클래스.parse자료형(s)

  • intValue() : int  타입으로 값 리턴
  • parseInt(string s) : 문자열을 정수로 변환한 값 리턴
  • toString(int i) : 정수 i 를 문자열로 변환하여 리턴 / toString()은 wrapper객체명.toString() 으로도 사용가능
  • valueOf(int i) : 정수 i를 담은 Integer 객체 리턴
  • valueOf(string s) : 문자열 s를 정수로 변환하여 담고있는 integer객체 리턴

 
<wrapper 객체에서 기본타입 값 알아내기 : intValue() / 문자열을 기본타입으로 변환 : parseInt() / 기본타입 or wrapper객체를 문자열로 변환 : toString() >

1)wrapper 객체에서 기본타입 값 알아내기 : 기본형Value()
각 클래스마다 윗줄은 객체생성 없이 클래스명. 으로 호출하여 기본형 변수의 값으로 wrapper 객체를 만듬
밑줄은 만들어진 객체의 기본타입 값 조회 -> 객체명.기본형이름Value() 로 호출
 
2)문자열을 기본 데이터 타입으로 변환 : 클래스명. 으로 호출하여 parse클래스명() 사용
 
3)기본 타입을 문자열로 변환 : 클래스명. 으로 호출하여 toString() 사용 
 
 
<박싱과 언박싱> 
박싱 : 기본타입의 값을 wrapper 객체로 변환 -> Integer i = Integer.valueOf(10);
언박싱 : wrapper 객체에 들어있는 기본타입 값을 빼내기 -> int n = i.intValue();
자동 박싱 : Integer i = 10;
자동 언방싱 : int n = i;
 
 
 
 
<String>
1) 생성 방법 : 리터럴로 생성 / 생성자 이용

  • 리터럴로 생성  : String s = "hi";
  • 생성자 이용 : String s = new String("hi"); / char 배열을 매개변수에 넣어서 문자열로 만들수도 있음

<String 주요 메소드>

1) 문자열 비교 : eqauls() 혹은 compareTo(String anotherString)
compareTo : 문자열이 같으면 0 리턴, 이 문자열이 비교문자열보다 사전에 먼저 나오면 음수, 나중에 나오면 양수 리턴 
 
2) 문자열 연결 : +연잔자 혹은 concat(String str) 메소드 사용

3) 공백 제거 : 객체레퍼런스명.trim() -> 문자열 앞뒤 공백문자 (tab,enter,space)를 제거한 문자열을 리턴 
 
4)문자열의 문자 : 객체레퍼런스명.charAt(index) 

5)문자열 치환 : replace(target, replacement) : 꼭 홑문자 아니어도 가능함
 
6)대소문자 교체 : toLowerCase(), toUpperCase()
 
 
<StringBuffer 클래스> : 가변크기의 문자열 저장 클래스

  • Java.lang.StringBuffer
  • string클래스와 달리 문자열 변경 가능
  • StringBuffer 객체의 크기는 스트링 길이에 따라 가변적
  • 생성 : StringBuffer sb = new StringBuffer("java");

<주요 메소드>
1)append(String str), append(StringBuffer sb) : 매개변수를 현재 스트링버퍼에 덧붙임
2)int capacity() : 스트링버퍼의 현재크기 리턴
3)StringBuffer delete(int start,int end)  : start위치에서 end위치 앞까지 문자열 삭제
4)insert(int offset,string str) : str을 스트링 버퍼의 offset위치에 삽입
5)replace(int sstart,int end,str) ; 스트링버퍼 내의 start위치의 문자부터 end가 지정하는 문자 앞의 서브스트링을 str로 대치
6)reverse() : 문자들을 반대순서로 변경
7)setLength(int newLeng) : 스트링 버퍼 내 문자열 길이를 newleng으로 설정, 현재 길이보다 크면 널문자(공백)으로 채우며 작은 경우는 기존 문자열이 잘린다
 
 
<StringTokenizer 클래스> :  하나의 문자열을 여러 문자열로 분리할 때 사용

  • 문자열을 분리할 때 사용되는 기준 문자 : 구분 문자 (밑의 예시에선 &가 구분문자)
  • 사용법 : string 을 먼저 만들고 그 스트링을 구분자로 쪼갬, 매개변수는 string 이름, 구분자
  • 토큰 : 구분문자로 분리된 문자열
  • String 클래스의 split(() 메소드를 이용하여 동일하게 구현이 가능함
  • 주요 메소드 : countTokens(분리한 토큰 개수 리턴) , hasMoreTokens(다음 토큰 있으면 true) , nextToken(들어있는 다음 토큰 리턴) - hasMoretokens와 nexttokens 같이 와일문으로 써서 출력

 
 
<math 클래스> : 산술 연산 메소드 제공, java.lang.Math

  • 모든 메소드는 static 타입 : 클래스 이름으로 바로 호출해야함

math클래스를 활용한 난수 발생 : static double random() 
-> 0.0~ 1.0 미만의 임의의 double값을 반환함

1)Math.random()*1000.0~99.99.. 사이의 실수 리턴
2)Math.random()*100+11.0~100.99.. 사이의 실수 값
3)(int)(Math.random()*100 + 1)소수점이하를 제거하여 1~100 사이의 정수 값
¨
 

 

 
<18일자 정리>

#객체 안만들고 쓸 메소드는 static !! / static 메소드 사용시에는 . 연산자 사용 안하고 바로 메소드명(매개변수)로 사용
#예외처리 / 다른 클래스에서 사용할때는 클래스명으로 호출 (클래스명.메소드명(매개변수))
1) 정수를 0으로 나누는 경우 : ArithmeticException
2) 배열보다 큰 인덱스로 배열의 원소 접근 : ArrayIndexOutOfBoundsException
3) 정수 입력해야 하는데 문자 입력 ; InputMismatchException
#static은 this 사용 불가능
#this() 로 다른 생성자호출 가능, 생성자 코드의 제일 첫 줄에 있어야 / 괄호 안의 매개변수로 호출할 생성자 선택함
#배열이 리턴값일 때 : int[] / 배열이 매개변수일 때 : int c[] 혹은 int c[] {1,2,3}
#final 클래스와 메소드 - 더이상 상속과 오버라이딩이 불가능
#final 상수 : public (static) final double pi = 3.14;)
#static 필드(변수) : 전역변수 만들고자 할 때(객체 간에 값이 공유되었으면 할 때)  사용
#public이더라도 다른 패키지에서 쓸땐 import.패키지명.클래스명;으로 임포트문 작성해주어야함
#객체 배열은 배열 레퍼런스와 배열 공간 생성 => 각 인덱스 칸마다 객체 생성 => 그 후 이용으로 이뤄짐 (일반형 객체와 다르게 new가 두번 들어간다는 점 기억하기)
#입력받을 때 공백이랑 엔터 중 하나만 나오면 next() 써도 무방하고 공백이랑 엔터가 같이나오면 nextLine() 써야함
#생성자 : 호출은 서브가 먼저, 실행은 슈퍼가 먼저
#호출할 슈퍼클래스 생성자 지정은 super() 로 가능한데 this() 와 마찬가지로 생성자 코드 맨 첫줄에 와야함
#this. 과 super. 은 맨 첫줄에 오지 않아도 됨
#업캐스팅 : 서브클래스 객체의 레퍼런스 타입을 슈퍼클래스로 교체 - 자동으로 됨
예) person p = new student();
서브에서'만' 정의한 변수나 메소드는 못보고,  서브에서 오버라이딩된 메소드는 오버라이딩된채로 실행됨(동적바인딩)
#다운캐스팅 : 슈퍼클래스 객체의 레퍼런스 타입을 서브클래스로 교체 - 명시적으로 해야함
예) student s ;
person p = new person();
s = (student)p;
#instanceof : 겍체레퍼런스 instanceof 클래스명 -> 객체가 해당 클래스이면 true, 아니면 false 출력 / 클래스명은 실제 객체클래스를 포함한 객체클래스의 부모클래스 타입으로 가능
#추상메소드 : 선언되어 있으나 구현되어 있지 않은 메소드 , abstract로 선언
#추상클래스(is kind of) : 추상메소드를 하나라도 가진 클래스 혹은 추상메소드 없지만 추상클래스로 선언된 클래스 - 객체생성 불가, 자식클래스에서 추상메소드 오버라이딩 해야 객체생성 가능 , 일반변수 가능, 추상메소드와 일반메소드 모두 포함, 다중상속 불가능, 생성자 존재
#인터페이스(is able to + should) : 필드(변수)는 상수만 가능 , 메소드는 private,static,default(생략불가),abstract 만 포함, 객체생성은 안되지만 static메소드는 메인메소드에서 객체 생성 없이 사용 가능함 , 다른 인터페이스 상속 가능(extends) , 클래스에 다중상속 가능 , 인터페이스 타입의 레퍼런스 변수 선언 가능, 생성자 없음
#인터페이스 상속받은 추상메소드 구현시엔 접근지정자 public으로
#객체의 클래스명(실체의 클래스명) 알아내야 할 때  
)instanceof : 단 클래스타입에 실제 객체의 부모클래스를 넣어도 true로 나오므로 if문 순서가 가장 끝 자식부터여야함
2)getClass().getName() :패키지만 default 라면 if문 상관없이 사용 가능( 바로 실제 객체가 나옴)
#상속 클래스 객체와 부모클래스 객체들을 부모클래스 타입의 배열로 만들었을 때 만약 자식클래스에서만 작성한 메소드를 사용해야 한다면 형변환(다운캐스팅) 해서 사용하면 됨
 
#object 클래스 주요 메소드 ; boolean equals(문자열 비교에 쓰는게 아니면 오버라이딩 해서 사용), Class getClass, int hashcode, String toString ( 오버라이딩 해서 원하는 형식의 리턴값 만들어서 씀)
#wrapper 클래스 : Byte Short Integer Long Character Float Double Boolean
#기본형 타입의 값으로 wrapper 객체 생성하기 : 래퍼클래스 변수명 = 기본형value(값);
답 : 래퍼클래스 변수명 = valueOf(값)
#wrapper 객체의 값을 다른 기본형 변수에 넣기 : 기본형 변수명 = 변수의래퍼클래스.parse기본형(객체명.toString())
# wrapper 객체의 값을 String 형 변수에 넣기 ; String s = 객체명.toString()
# String 형 변수의 값을 다른 일반형 변수에 넣기 : 기본형 변수명 = 변수의래퍼클래스.parse기본형(stirng s)
#래퍼객체에서 해당 기본형 값을 뽑아낼 때 : 기본형 변수명 = 래퍼객체명.변수명Value()
#기본타입을 문자열로 변환 ; string s = 기본래퍼클래스.toString(" ")
#stringbuffer 생성 : StringBuffer sb = new StringBuffer("java");
 
 
<문제모음>

임의의 전화번호 생성 ! string을 한번에 생성하면 자릿수가 다양해져서 하나씩 추가하는 방식으로 구현

 

만약 0-1000대가 다 랜덤하게 나오라고 하면 이렇게 하면될듯 / wrapper클래스 사용

 

이름,생년월일 입력받고 생년월일은 년월일로 바꿔출력 :&amp;nbsp; 처음엔 string 메소드중에 replace 쓰면 된다고 생각했는데 그걸 쓰려면 바꿀 문자가 같아야 한다 !! 이 점 주의하고, 바꿀 문자가 다 다를때는 stringtokenizer 이용하기

 

출력메소드를 오버라이딩 - toString 을 오버라이딩해서 객체를 자동으로 내가 정한 형식으로 출력하게 하면 됨 !

 

역시 toString을 오버라이딩 사용 / 생성자가 단순 대입만이 아닐 수도 있음 / .연산자 없이 그냥 메소드 사용 가능

 

여기서도 역시 .연산자 없이 바로 메소드 호출 가능한거 보여줌

 

equals () 오버라이딩 : 같은 객체로 만들기 - 같다고 판단하는 기준 if문으로 작성
배열 정렬 문제 ! 차례대로 한 인덱스마다 해당 인덱스의 배열값을 해당 인덱스 이상의 배열값들과 비교하는 원리 기억하기
whiel,if,예외처리 혼합문제 / continue 와 break
처음에 출력형식 잘못되었던 문제 ! 매치되는 한국어 단어 출력하고도 그런단어 없다는 문장이 출력되었다 - break문 필요(while문이 아니라 for문 빠져나감) //처음에 어떻게 매치단어 찾지 했는데 equls() + 각 매치단어가 같은 인덱스값이라는거 활용하면 됨

 

1)스트링토크나이저 원소 출력시엔 while문 쓰자 / trim() 써야하는거 놓침 ! 오른쪽이 trim() 사용한 코드 , 토크나이저 원소를 다시 별도의 문자열에 넣고 그 문자열에 trim 한 문자열을 대입 후 더함

 
 

equals() 오버라이딩 시에는 매개변수 하나인 형태로 작성 + 2개도 가능하긴 함

 

문자열 입력 후 그 중 하나 랜덤으로 알파벳 교체, 인덱스 지정해서 교체하는건 스트링 버퍼만? - 맞음 !

 
 

static 메소드를 객체 안만들고 쓰더라도 다른 클래스라면 클래스명.으로 호출해야함 ! / equals() 메소드 매개변수 두개로 오버라이딩 한 예

 

처음에 11,12 줄 앞에 int 붙여서 오류났었음 - 이미 선언한 멤버변수를 다시 선언했으니,, 별도의 변수가 됨 ! input 으로 멤버변수 a,b 가져와서 calc 계산 후 출력하는 원리

 

배열검색, 예외처리, 음수입력 시 종료 세가지 기능을 모두 하는 코드 ! 항상 예외처리 후 다시 반복문 실행할땐 sc.next() 해서 버퍼를 비워줘야함

 

배열 정렬 : ar[0]부터 차례로 본인 이상의 인덱스 속 값과 비교 - ar[0]이 더 크면 0값은 별도 int에 넣어두고 ar[0]자리에 뒷 값 넣고 뒷값에는 int값 넣음

 
 
<6장 수업듣고 다시 간단히 정리>
*static 메소드 사용하더라도 클래스가 다르면 클래스. 으로 호출하여 써야함 !!!!!!!!!!
1)object 클래스 : equals() (문자열 비교, 그 외 객체 비교 시에는 오버라이딩해서 사용) , getClass().getName() , hashCode(), toString() (오버라이딩 해서 사용) 
 
2) wrapper 클래스 : Byte Short Ingeger Long Character Float Double Boolean
#기본형 타입의 값으로 wrapper 객체 생성하기 : 래퍼클래스명 변수명 = 래퍼클래스명.valueOf(값)
#wrapper 객체의 값을 종류 다른 기본형 변수에 넣기 : 기본형 변수명 = 기본형의래퍼클래스.parse기본형(객체.toString())
# wrapper 객체의 값을 String 형 변수에 넣기 : String 변수명 = 객체.toString()
# String 형 변수의 값을 다른 일반형 변수에 넣기 : 기본형 변수명 = 기본형의래퍼클래스.parse기본형(s)
#래퍼객체에서 해당 기본형 값을 뽑아낼 때 : 기본형 변수명 = 객체명.기본형value()
#기본타입을 문자열로 변환 : String s = 기본형의래퍼클래스.toString(기본형값)
#문자열로 wrapper 객체 생성( 리터럴) : 래퍼클래스 객체명 = 래퍼클래스명.valueOf(리터럴)
#문자열을 기본 데이터 타입으로 변환 : 기본형 변수명 = 래퍼클래스명.parse기본형(문자열)
 
3)String 생성 : 리터럴(내용이 같으면 객체 공유) , 생성자(객체 별도)
주요 메소드

string 객체 메소드 사용 예시

 

한글영어 매칭단어와 유사한 문제 ! for문으로 하나씩 검색 후 있으면 출력하고 break, 없으면 없습니다 출력 후 컨티뉴

 
4)stringbuffer : 스트링과 비슷하지만 크기와 문자열 내용이 가변적인 클래스임

append : 뒤에 이어붙이기
insert : 해당 인덱스에 문자열 삽입 (7 위치가 is랑 펜슬 사이 공백 - 그 공백 자리에 ' my' 삽입함 , 원래 7위치의 공백은 사라지는게 아니고 뒤로 밀림)
replace : 시작 인덱스부터 끝 인덱스까지 내용을 없애고 그 자리에 문자열로 대치 (8-10은'my' -> 'your'로 바꿈)
따로 대입 없이 그냥 메소드 사용만 하면 해당 sb 객체의 내용이 변경되는듯 /  문자열은 대입해야 변경 !
 
5)StringTokenizer 클래스 : 구분문자를 기준으로 문자열을 분리하는 클래스

구분문자가 두개일수도 ! 이땐 둘중 하나라도 있으면 구분

 
6)Math 클래스 : 기본 산술 연산 메소드를 제공하는 클래스 , 모든 메소드가 static(클래스 이름으로 호출)
  Math.random() 메소드로 난수 발생 -> 0.0 이상 1.0 미만의 실수 발생
 (int)(Math.random()*100+1) -> 1 이상 100 이하의 정수 발생

난수발생은 사진처럼 Random 클래스의 객체를 생성해서도 가능
 
#static인 경우 바디 있더라도 디폴트 안씀