String 주소값 비교
package newchapter1;
public class Test {
public static void main(String[] args) {
int a = 1;
int b = 1;
// String만 유일하게 new 연산자를 쓰지 않고 초기화 할 수 있음
//=> 이로인해 생성괸 것을 문자열 상수라고함
//=> 메소드 영역 상수풀에 저장됨 (상수엔 final 상수 등등이 저장되는곳)
//=> 상수풀에서는 같은 이름이면 같다고 봄
String str1 = "HELLO"; //기존에 상수풀에 없으면 만들고, 있으면 있는걸 참조
String str2 = "HELLO"; //여기선 기존걸 참조
String str3 = new String("HELLO"); //객체 생성 주소값 다름
String str4 = new String("HELLO"); //객체 생성 주소값 다름
System.out.println(str1 ==str2); //주소값비교
System.out.println(str3 ==str4); //주소값비교
System.out.println(a == b);
}
}
<출력 결과>
true false true
오버로딩 예시
package newchapter1;
public class Calculator {
int num1 = 3; //선언후 값을 초기화 하지 않으면 인스턴스를 생성해낼때 0으로 자동 초기화됨 String는 null(참조는 모두 null), boolean는 false int는 0
int num2 =3;
// 더하기 메서드1 // 매개변수 없이 실행
public void addNumbers() { //여기서는 맴버 변수를 보고있지만
int sum = num1 + num2;
System.out.println("sum: "+ sum);
};
// 더하기 메서드2 // 매개변수 넣고 실행
public void addNumbers(int num1, int num2) { //여기서는 매개변수를 우선시 하여 파라미트의 값을 봄
int sum = num1 + num2;
System.out.println("sum: "+ sum);
};
//오버로딩(반환값도 달라도 됨. 오버라이드(상속)는x) 예시
public void addNumbers(int num1, int num2,int num3) { //여기서는 매개변수를 우선시 하여 파라미트의 값을 봄
int sum = num1 + num2 + num3;
System.out.println("sum: "+ sum);
};
//리턴
public int addNumbers1(int num1, int num2) { //여기서는 매개변수를 우선시 하여 파라미트의 값을 봄
int sum = num1 + num2;
System.out.println("sum: "+ sum);
return sum;
};
public static void main(String[] args) {
new Calculator().addNumbers(); //Calculator라는 인스턴스 생성 거기서 addNumbers()를 호출
new Calculator().addNumbers(1,4); //Calculator라는 인스턴스 생성 거기서 addNumbers()를 호출
// System.out.println("================");
System.out.println(new Calculator().addNumbers1(1,4)); //addNumbers1의 리턴값5을 받음. 그걸 프린트함
}
}
<출력>
sum: 6 sum: 5 sum: 5 5
코드의 최적화 단계
<메인>
package newchapter1;
public class Main {
public static void main(String[] args) {
//변수 이용
String name1 = "김다희1";
int age1 = 25;
int score1 = 90;
String name2 = "김다희2";
int age2 = 24;
int score2 = 80;
String name3 = "김다희3";
int age3 = 23;
int score3 = 70;
System.out.println("이름:" + name1 + ", 나이:" + age1 + ", 점수:" + score1);
System.out.println("이름:" + name2 + ", 나이:" + age2 + ", 점수:" + score2);
System.out.println("이름:" + name3 + ", 나이:" + age3 + ", 점수:" + score3);
System.out.println("==================================================");
//최적화 1단계
//배열생성 방법
//1번 어떤 값이 들어갈지 모를떄 //String[] names = new String[3];
//2번 값이 정해져있을떄 //String[] names = {name1, name2, name3};
//배열 이용
String[] names = new String[3]; //이름저장 배열 //String[] names 배열선언 , new String[3] 방3개 만들어줌 = 초기화
int[] ages = new int[3]; //나이저장 배열
int[] scores = new int[3]; //점수저장 배열
names[0] =name1;
ages[0] =age1;
scores[0] =score1;
names[1] =name2;
ages[1] =age2;
scores[1] =score2;
names[2] =name3;
ages[2] =age3;
scores[2] =score3;
System.out.println("이름:" + names[0] + ", 나이:" + ages[0] + ", 점수:" + scores[0]);
System.out.println("이름:" + names[1] + ", 나이:" + ages[1] + ", 점수:" + scores[1]);
System.out.println("이름:" + names[2] + ", 나이:" + ages[2] + ", 점수:" + scores[2]);
//최적화 2단계
System.out.println("==================================================");
for (int i = 0; i < names.length; i++) {
System.out.println("이름:" + names[i] + ", 나이:" + ages[i] + ", 점수:" + scores[i]);
}
//최적화 3단계 클래스 이용
//객체는 클래스를 인스턴스화하여 메모리에 올린것
//최적화 4단계 배열 이용 (Student 타입의 배열을 만들자)
Student[] students = new Student[3];
students[0] = new Student(name1,age1,score1); // Student타입의 변수s1 변수의 선언, new Student() 객체를 만듬 그리고 생성자 호출함 , 그리고 s1에 대입함.
students[1] = new Student(name2,age2,score2);
students[2] = new Student(name3,age3,score3);
System.out.println("===============================================1");
//System.out.println(s1); //주소값이 출력됨 //@79fc0f2f 해시코드
for (Student student : students) {
student.printInfo();
}
Student student1 = new Student("홍길동");
Student student2 = new Student("홍길동",23);
Student student3 = new Student("홍길동",23,90);
//오버로딩 예시
new String("A");
char[] ch = {'A'};
new String(ch);
}
}
<클래스>
class Student implements StudentInter { //public은 못 붙음. 왜냐면 파일명의 클래스에 붙음
String name;
private int age;
int score;
//캡슐화
public void setAge(int age) {
if ( 0 > age || age >200) {
return;
}
this.age=age;
}
//생성자
public Student(String name, int age, int score){
this(name,age);
this.score =score;
//생성자 안에서this.은 필드를 의미함
}
//생성자
public Student(String name, int age){
this(name);
this.age = age;
}
//생성자
public Student(String name){
this.name = name;
}
public void printInfo() {
System.out.println("이름:" + name + ", 나이:" + age + ", 점수:" + score);
}
// public void printInfo(int a) {
// System.out.println("이름:" + name + ", 나이:" + age + ", 점수:" + score);
// }
}
<인터페이스
package newchapter1;
interface StudentInter { //interface 안의 메서든ㄴ 모두 public임 interface는 추상메서드로만 구성되어 있음
void printInfo(); //추상메서드
}
public class StudentMain {
public static void main(String[] args) {
Student s = new Student("홍길동");
//s.age = 10;
s.setAge(-10); //넣는건 막을수 없지만 튕겨 낼수 있음 //캡슐화
s.printInfo();
}
}
<출력결과>
이름:김다희2, 나이:24, 점수:80 이름:김다희3, 나이:23, 점수:70
이름:김다희2, 나이:24, 점수:80 이름:김다희3, 나이:23, 점수:70
이름:김다희1, 나이:25, 점수:90 이름:김다희2, 나이:24, 점수:80 이름:김다희3, 나이:23, 점수:70 ===============================================1 이름:김다희1, 나이:25, 점수:90 이름:김다희2, 나이:24, 점수:80 이름:김다희3, 나이:23, 점수:70