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();

	}

}

<출력결과>

이름:김다희1, 나이:25, 점수:90

이름:김다희2, 나이:24, 점수:80 이름:김다희3, 나이:23, 점수:70

이름:김다희1, 나이:25, 점수:90

이름:김다희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