허정식 강사님 블로그
목차
Object 클래스
1. 자바의 클래스를 선언할 때 extends 키워드로 다른 클래스를 상속하지 않으면 암시적으 로 java.lang.Object 클래스를 상속하게 된다.
2. 따라서 자바의 모든 클래스는 Object 클래스의 자식이거나 자손 클래스가 된다.
3. 즉, Object는 자바의 최상위 부모 클래스에 해당된다.
4.
주로 clone(), equals(), hashCode(), toString()을 흔히 override해서 사용한다.
1. Object 메소드 ()
•
public boolean equals(Object obj) : obj가 이 객체와 같은지를 검사한다.
•
public String toString() : 객체의 문자열 표현을 반환한다.
•
protected Object clone() : 객체 자신의 복사본을 생성하여 반환한다.
•
public int hashCode() : 객체에 대한 해쉬 코드를 반환한다.
•
protected void finalize() : 가비지 콜렉터에 의하여 호출된다.
•
public final Class getClass() : 객체의 클래스 정보를 반환한다.
1) 객체 비교 equals() 메소드
String 객체의 equals() 메소드는 String 객체의 번지값을 비교하는 것이 아닌 문자열이 동일한지 조사해서 같다면 true, 그렇지 않다면 false를 리턴한다.
•
== 는 번지값을 비교한다. (물리적 비교)
•
equals() 는 번지값 비교가 아닌 문자열 자체를 비교한다. (논리적 비교)
public class Main {
public static void main(String[] args) {
String str1 = "apple"; // 리터럴을 이용한 방식
String str2 = "apple"; // 리터럴을 이용한 방식
String str3 = new String("example"); // new 연산자를 이용한 방식
String str4 = new String("example"); // new 연산자를 이용한 방식
System.out.println("str1 == str2 : " + (str1 == str2));
System.out.println("str3 == str4 : " + (str3 == str4));
}
}
//결과값 :
//str1 == str2 : true
//str3 == str4 : false
Java
복사
예제 설명
class Circle {
int radius;
public Circle(int radius) {
this.radius = radius;
}
}
public class Main {
public static void main(String[] args) {
Circle obj1 = new Circle(10);
Circle obj2 = new Circle(10);
if (obj1 == obj2)
System.out.println("2개의 원은 같습니다.");
else
System.out.println("2개의 원은 같지 않습니다.");
}
}
//결과값 :
//2개의 원은 같지 않습니다.
Java
복사
2) toString() 메소드
toString() 메소드는 객체의 문자 정보를 리턴한다.
•
toString() 매소드를 재정의(오버라이딩)하여 자주 사용한다.
class Student {
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
// protected void setName(String name) {
// this.name = name;
// }
//
// protected String getName() {
// return name;
// }
//
// protected void setSex(String sex) {
// this.sex = sex;
// }
//
// protected String getSex() {
// return sex;
// }
@Override
public String toString() {
return "이름은 " + this.name + "이고 성별은 " + this.sex + "입니다.";
}
}
public class Main {
public static void main(String[] args) {
Student student1 = new Student("홍길동", "남자");
System.out.println(student1);
}
}
//결과값 :
//이름은 홍길동이고 성별은 남자입니다.
Java
복사
String 클래스
1. String 메소드
•
String 객체 - 문자열 비교하기
•
String 객체 - 문자 추출
•
String 객체 – 문자열 안에서 단어 찾기
•
String 객체 – 문자열 길이
•
String 객체 – 공백 잘라내기(trim())
•
String 객체 – 문자열을 단어로 분리
•
String 객체 – valueOf()
1) String 객체 - 문자열 비교하기
equals()
•
String 객체를 비교시 == 보다는 equals() 를 많이 사용한다.
•
리터럴 초기화 방식과 객채 생성 초기화 방식의 메모리 구조 파악이 중요하다.
public class Main {
public static void main(String[] args) {
String s1 = "java";
String s2 = "java";
String s3 = new String("java");
String s4 = new String("java");
if (s1 == s2)
System.out.println("s1 == s2 : 같습니다.");
else
System.out.println("s1 == s2 : 다릅니다.");
if (s3 == s4)
System.out.println("s3 == s4 : 같습니다.");
else
System.out.println("s3 == s4 : 다릅니다.");
}
}
//결과값 :
//s1 == s2 : 같습니다.
//s3 == s4 : 다릅니다.
Java
복사
class INum {
private int num;
public INum(int num) {
this.num = num;
}
//equals() 예제1
/*
@Override
public boolean equals(Object obj) {
if (this.num == ((INum) obj).num) // obj 형변환
return true;
return false;
}*/
//equals() 예제2 => 더 추처하는 코드
@Override
public boolean equals (Object obj) {
if (obj instanceof INum) { // 형변환 가능한지 여부 확인
INum inum = (INum) obj;
if(num == inum.num) return true;
}
return false;
}
}
public class Main {
public static void main(String[] args) {
INum num1 = new INum(10);
INum num2 = new INum(12);
INum num3 = new INum(10);
if (num1.equals(num2))
System.out.println("num1, num2 내용 동일하다.");
else
System.out.println("num1, num2 내용 다르다.");
if (num1.equals(num3))
System.out.println("num1, num3 내용 동일하다.");
else
System.out.println("num1, num3 내용 다르다.");
}
}
//결과값 :
//num1, num2 내용 다르다.
//num1, num3 내용 동일하다.
Java
복사
2) String 객체 - 문자 추출
charAt()
•
charAt() 메서드는 string 타입으로 받은 문자열을 char 타입으로 한 글자만 받는 함수이다.
public class Main {
public static void main(String[] args) {
System.out.println("자바 프로그래밍".charAt(1));
}
}
//결과값 :
//바
Java
복사
public class Main {
public static void main(String[] args) {
String str = "자바 프로그래밍";
for(int i =0;i<str.length();i++) {
System.out.println(str.charAt(i));
}
}
}
//결과값 :
//자
//바
//
//프
//로
//그
//래
//밍
Java
복사
3) String 객체 – 문자열 안에서 단어 찾기
indexOf()
•
특정 문자나 문자열이 처음 발견되는 인덱스를 찾아 반환한다.
•
만약 찾지 못했을 경우 -1을 반환한다.
public class Main {
public static void main(String[] args) {
String str = "Tha cat is on the table";
int index = str.indexOf("table");
System.out.println(index);
}
//결과값 :
//18
Java
복사
•
단어 table을 찾아 시작 인덱스를 받는다.
4) String 객체 – 문자열 길이
length()
•
length() 메서드는 문자열의 길이를 구하여 반환하는 메소드이다.
public class Main {
public static void main(String[] args) {
String str = "Tha cat is on the table";
System.out.println(str.length());
}
}
//결과값 :
//23
Java
복사
•
공백도 문자로 인식
public class Main {
public static void main(String[] args) {
int count = 0;
String[] strArr = { "abcd", "봄", "가을" };
for (String str : strArr) {
count += str.length();
}
System.out.println(count);
}
}
//결과값 :
//7
Java
복사
5) String 객체 – 공백제거
trim()
•
문자열 앞뒤의 공백을 제거할 때 사용
public class Main {
public static void main(String[] args) {
String str = " I love you ";
System.out.println(str.trim());
}
}
//결과값 :
//I love you
Java
복사
6) String 객체 – 문자열을 단어로 분리
split(), StringTokenizer()
•
문자열을 원하는 문자 or 길이 만큼 자르고 배열로 리턴 하는 메서드
Scanner를 이용하여 한 라인을 읽고, 공백으로 분리된 어절이 몇 개 들어 있는지 "그만"을 입력할 때까지 반복하는 프로그램을 작성하라.
I love Java.어절 개수는 3자바는 객체 지향 언어로서 매우 좋은 언어이다.어절 개수는 7그만종료합니다...[Hint] Scanner.nextLine()을 이용하면 빈칸을 포함하여 한 번에 한 줄을 읽을 수 있다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.print("입력 >> ");
String str = sc.nextLine();
if (str.equals("그만")) {
System.out.println("종료");
break;
} else {
System.out.println("어절 개수는 " + str.split(" ").length);
}
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
}
Java
복사
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.print("입력 >> ");
String s = sc.nextLine();
if(s.equals("그만")) {
System.out.println("종료");
break;
}
StringTokenizer st = new StringTokenizer(s, " ");
System.out.println("어절 개수는 " + st.countTokens());
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
}
Java
복사
7) String 객체 – valueOf()
valueOf()
•
어떠한 타입의 값을 넣어도 String 문자열로 반환 한다.
public class Main {
public static void main(String[] args) {
String[] strArr = new String[3];
int num = 100;
boolean bool = true;
strArr[0] = String.valueOf(num);
strArr[1] = String.valueOf(100);
strArr[2] = String.valueOf(bool);
for(String strPrint : strArr)
System.out.println(strPrint + " " + strPrint.getClass().getName()); //데이터 타입 확인
}
}
//결과값 :
//100 java.lang.String
//100 java.lang.String
//true java.lang.String
Java
복사
Stack 구현
•
스택을 흔히 선출후입(LIFO)이라고 부른다.
= 한쪽에서만 자료를 넣고 뺄 수 있는 구조
= 가장 마지막에 넣은 데이터가 가장 먼저 나간다.
isFull() : 스택이 가득찬 상태인지 확인하는 메서드
isEmpty() : 스택이 비어있는 상태인지 확인하는 메서드
push() : 스택 길이를 확인하고 추가가 가능하면 스택에 데이터를 추가하는 메서드
pop() : 스택이 비어있지 확인 후 데이터를 반환하고 삭제하는 메서드
peek() : 데이터를 삭제하지 않고 top의 데이터를 확인하는 메서드
class Stack {
private int top;
private int stackSize;
private char stackArr[];
// 스택이 비어있는 상태인지 확인
// 스택 포인터가 -1인 경우 데이터가 없는 상태이므로 true 아닌 경우 false를 return
public boolean isEmpty() {
return (top == -1);
}
// 스택이 가득찬 상태인지 확인
// 스택 포인터가 스택의 마지막 인덱스와 동일한 경우 true 아닌 경우 false를 return
public boolean isFull() {
return (top == this.stackSize - 1);
}
// 스택에 데이터를 추가
public void push(char item) {
if (isFull()) {
System.out.println("Stack is full!");
} else {
stackArr[++top] = item; // 다음 스택 포인터가 가리키는 인덱스에 데이터 추가
System.out.println("Inserted Item : " + item);
}
}
// 스택의 최상위(마지막) 데이터 추출 후 삭제
public char pop() {
if (isEmpty()) {
System.out.println("Deleting fail! Stack is empty!");
return 0;
} else {
System.out.println("Deleted Item : " + stackArr[top]);
return stackArr[top--];
}
}
// 스택의 최상위(마지막) 데이터 추출
public char peek() {
if (isEmpty()) {
System.out.println("Peeking fail! Stack is empty!");
return 0;
} else {
System.out.println("Peeked Item : " + stackArr[top]);
return stackArr[top];
}
}
// 스택 초기화
public void clear() {
if (isEmpty()) {
System.out.println("Stack is already empty!");
} else {
top = -1; // 스택 포인터 초기화
stackArr = new char[this.stackSize]; // 새로운 스택 배열 생성
System.out.println("Stack is clear!");
}
}
// 스택을 생성하는 생성자
public Stack(int stackSize) {
top = -1; // 스택 포인터 초기화
this.stackSize = stackSize; // 스택 사이즈 설정
stackArr = new char[this.stackSize]; // 스택 배열 생성
}
// 스택에 저장된 모든 데이터를 출력
public void printStack() {
if (isEmpty()) {
System.out.println("Stack is empty!");
} else {
System.out.print("Stack elements : ");
for (int i = 0; i <= top; i++) {
System.out.print(stackArr[i] + " ");
}
System.out.println();
}
}
}
public class StackTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("스택 사이즈를 입력하시오.");
int stackSize = sc.nextInt() ;
Stack stack = new Stack(stackSize);
stack.push('A');
stack.printStack();
stack.push('B');
stack.printStack();
stack.push('C');
stack.printStack();
stack.pop();
stack.printStack();
stack.pop();
stack.printStack();
stack.peek();
stack.printStack();
stack.clear();
stack.printStack();
}
}
Java
복사