Object 클래스는 java.lang 패키지에들어있는 모든 클래스의 조상이며 오직 11개의 메서드만을 가지고 있다.
자바는 많은 클래스에서 객체지향적 프로그래밍을 하기 위해 공통적으로 써야 할만한 것들을 object에 모아둔것이다.
https://www.youtube.com/watch?v=NI6QZy6juc8
🔍 활 용: object 클래스의 메소드를 오버라이딩하여 프로그램에 필요한 코드로 재정의 할 수 있다.
🔽 Equals() 메소드 code
class Circle {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Circle) {
Circle c1 = (Circle) obj;
if (this.radius == c1.radius)
return true;
}
return false;
}
}
public class ObjectTest {
public static void main(String[] args) {
Circle circle = new Circle(10);
Circle circle2 = new Circle(10);
if (circle == circle2) {
System.out.println("2개의 원은 같습니다.");
} else {
System.out.println("두개의 원은 같지 않습니다.");
}
// if는 숫자적으로 연산자로 비교를 하는것이기 때문에 주소값을 가진 참조변수는 따질 수 없다.
// 따라서 출력값은 "두개의 원은 같지 않습니다."
if (circle.equals(circle2)) {
System.out.println("2개의 원은 같습니다.");
} else {
System.out.println("두개의 원은 같지 않습니다.");
}
// eeuals문을 이용함으로써 반지름을 가진 객체라면 true로 나오게끔 설정해주었다.
// 따라서 출력값은 "2개의 원은 같습니다."
}
// public boolean equals(Object anObject) {
// if (this == anObject) {
// return true;
}
🔽 toString() 메소드
public class Test {
public static void main(String[] args) {
// 참조변수를 print()하면 주소 값이 나오는 이유는,
// print(Object) 함수에 toString()이 포함 되어 있기때문이고,
// 이 toSrting은 Object 클래스에 기본메서드 인데, 오버라이딩을 해주지 않는이상
// 아래와같이 해쉬태그를 출력하기로 정의되어 있기 때문이다.
// Object 클래스의 기본 toString() 코드
// public String toString() {
// return getClass().getName() + "@" + Integer.toHexString(hashCode());
// }
Object obj = new Object();
System.out.println(obj.toString());
System.out.println(obj);
// 그냥 객체를 넣으면, println(Object obj)을 f3으로 확인해봤을 때, 안데 ValueOf라는 함수가 있어서,
// 참조 변수가 null이 아니면 obj.toString() 되도록 코드가 짜있다. 그래서 위 두줄 코드는 같은 값을 반환한다.
// (밑 코드 참조)
/*
* public static String ValueOf(Object obj) { return (obj == null) ? "null" :
* obj.toString(); }
*/
}
}
String 클래스
String 클래스는 문자열을 구성하는 문자들을 내부에 저장하는 배열이라고 생각한다. 또 그 안에는 변수를 제어하는 수 많은 메서드가 있다.
🔽 문자열 비교 code
public class Test {
public static void main(String[] args) {
// string 클래스의 주요 변수
// private final byte[] value;
// (1) 리터럴을 정의해서 쓰기
String s1 = "java";
String s2 = "java";
// (2) 객체 생성해서 쓰기
String s3 = new String("java");
String s4 = new String("java");
if (s1 == s2) {
System.out.println("같습니다.");
} else {
System.out.println("다릅니다.");
} // => "같습니다." 이건 왜 같다고 나올까?
// 리터럴 정의 방법은 "java"를 상수로 인식해서 메서드 메모리 쪽에 올려두기 떄문에 (static느낌)
// 같은 상수가 들어오면 같은 번지로 정의하기 때문에 비교했을때 같다고 나온다.
if (s3 == s4) {
System.out.println("같습니다.");
} else {
System.out.println("다릅니다.");
}
// => 다릅니다 (주소값이)
// 따라서 문자열 비교를 할때에는, 리터럴 정의보단 객체 생성해서 equal함수 써서 하기를 기준으로 잡아
// 다른 값이 나오게 실수 하지 않도록 주의하자.
if (s3.equals(s4)) {
System.out.println("같습니다.");
} else {
System.out.println("다릅니다.");
}
// => 같습니다. (객체안의 글자가)
}
}
🔽 문자비교 code
💡charAt()
public class Test {
public static void main(String[] args) {
String subject = "자바 프로그래밍";
char Value = subject.charAt(3);
char Value2 = "자바 프로그래밍".charAt(4);
// 리터럴도 컴파일러가 객체로 변환해서 쓸 수 있다.
System.out.println(Value);
System.out.println(Value2);
Scanner sc = new Scanner(System.in);
char ch = sc.next().charAt(0);
System.out.println(ch);
}
}
🔽 문자찾기 code
💡indexOf()
🔽 글자수세기code
public class Test {
// static이 붙은 main안에서 함수를 돌리려면 그 함수도 꼭 static을 붙여줘야한다.
public static int stringCount(String[] strArr) {
int count = 0;
for (String str : strArr) {
count = count + str.length();
}
return count;
}
public static void main(String[] args) {
String[] strArr = { "abcde", "봄", "가을" };
int total = stringCount(strArr);
System.out.println(total);
}
}
💡 trim()
공백없애기
String trimStr = " I LOVE you ";
System.out.println(trimStr.length());
System.out.println(trimStr.trim().length());
// 중간 공백 말고 맨 앞뒤 공백만을 없애, 출력값은 각각 12,10이다.
💡split()
분절
public static void main(String[] args) {
// 공백을 기준으로 문장을 자르겠다.
String[] tokens = "I am a boy".split(" ");
// 리턴값이 String 배열이다.
// 따라서 출력하려면, 아래와 같이 해야한다.
for (String token : tokens) {
System.out.println(token);
}
}
💡valueOf()
오버로딩 되어 있는 느낌을 받을 수 있으며 print()랑 비슷하다고 생각 할 수 있다. 이 메서드의 기능은 기본 타입값을 문자열로 전환하는것이다.
String str1 = String.valueOf(100);
System.out.println(str1); // "100"
String str2 = String.valueOf(false);
System.out.println(str2); //"false"
✍️ 활용문제
package Day0929;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Readline readline = new Readline();
while (true) {
readline.Read();
if (readline.getInput().equals("그만")) {
break;
}
System.out.println("어절 개수는 " + readline.countWord());
}
System.out.println("종료합니다...");
}
}
class Readline {
Scanner sc = new Scanner(System.in);
public String getInput() {
return input;
}
private String input;
private String[] word;
public void Read() {
this.input = sc.nextLine();
}
public int countWord() {
this.word = this.input.split(" ");
return word.length;
}
}
✏️ 개념
String클래스 안의 메서드의 특징으로 인해 빈번한 문자열 변경은 여러개의 객체 생성을 만들어 내기 때문에, StringBuilder
의 다양한 메서드를 이용해 객체 생성없이 문자열을 변경한다.
public static void main(String[] args) {
// 1. String끼리 연산자가 가능하다. (+)
String str = "Hello";
String str2 = "world";
String str3 = "Hello" + "world"; // 출력: Helloworld
//Hello.concat("world"); 요 문장이 자동 실행돼서 가능한거.
// 2.String은 데이터 타입이 달라도 연산이 가능하다.
String str4 = "Hello" + 1.0;
// 3. 중요한부분 = String은 연산을 할때마다 새로운 객체를 생성한다.
// 왜냐하면 문자열의 내용을 변경하는 String 클래스 메소드의 경우,
// 새로운 String 객체를 생성하고 기존의 내용을 복사하기 때문이다.
String str5 = str + "world" + "AAAS";
// 이와 같은 특성으로 인해 문제가 생길 수 있는 것을 방지하는것이
// StringBuffer, StringBuilder
}
🔍 메서드 종류
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("123");
sb.append(4567); //문자열 덧붙이기
sb.delete(0, 2); //문자열 삭제
sb.replace(0, 3, "AB"); // 문자열 일부교체
sb.reverse(); // 문자열뒤집기
sb.substring(2,4); // 인덱스 2~3에 해당하는 문자를 추출한다.
// string sub = sb.substring(2,4);
// 활용예제
Scanner sc = new Scanner(System.in);
System.out.println("입력하세요: ");
String input = sc.nextLine();
// I Love you
for (int i=0; i <= input.length(); i++) {
System.out.print(input.substring(i)); // input[i]~끝까지 뽑는다
System.out.println(input.substring(0,i)); // input[i]까지만 출력한다
}
sc.close();
}