23일차 - 2023.1.27

문우림·2023년 1월 30일
0

Java

목록 보기
9/23

1. this 함수

this 함수 = 같은 인스턴스의 생성자 내에서 다른 생성자를 가리킴.

  • 생성자 안에서만 존재 가능

📌this( ) 생성자에서 다른 생성자를 호출

package com.fxmx.simple;

class Person {
	private int regiNum;
	private int passNum;

	Person(int rnum) {
		this(rnum, 0); // 1번 : 2번 생성자를 호출하는 this
	}
    
    public Person(int rnum, int pnum) {
		this.regiNum = rnum;
		this.passNum = pnum; // 2번 : 자기 자신을 가리키는 this
	}
    
    Person(int runm) {
        regiNum = rnum;
        passNum = 0;
   }
}
  • rnum과 0을 인자로 받는 오버로딩됨 다른 생상지Person(int rnum, int pnum)를 호출.
  • this( ) 괄호 안에는 호출하는 생성자의 매개변수의 인자가 들어가야한다.

2.this란 무엇인가?

this는 인스턴스의 자기 자신을 가리키는 키워드.
this는 클래스를 기반으로 생성된 인스턴스를 가리키는 참조.

특징

  • 객체 자신의 대한 참조값을 가진다.(자기 자신)
  • 메소드 내에서만 사용된다.
  • 객체 자신을 메소드에 전달하거나 리턴하기 위해 사용
  • 매개 변수와 객체 자신이 가지고 있는 변수의 이름이 같은 경우 이를 구분하기 위해 자신의 변수에 this를 사용(this.멤버변수)
  • static 메소드에서는 사용할 수 없다.

📌생성자에서 자기 자신의 메모리르 가리키는 this (인스턴스 변수의 접근)

Student s1 = new Student(); 라는 인스턴스를 생성시켜서 this 를 사용한다면,

class SimpleBox {
   private int data;

   SimpleBox(int data) {
      this.data = data;
   }
}
  • s1는 heap메모리에 있는 해당 인스턴스의 주소값을 참조
  • this는 s1의 주소값을 똑같이 참조한다.
  • this는 하나의 클래스에 멤버변수명과 파라미터변수명이 같을 경우에 메버변수를 가리키는 용도로 사용된다. = this.변수명 으로 접근

3. String 클래스

자바가 제공하는 표준 클래스.(java.lang패키지에 포함되어 있음)

특징

  • 문자열과 관련된 작업을 할 때, 유용하게 사용할 수 있는 다양한 메소드가 포함되어 있음.
  • 한 번 생성하면 읽을 수만 있고, 변경할 수 없음 = 불변 객체 (immutable object)
  • +(덧셈) 연산자를 이용하여 문자열을 결합하면, 기종 문자열 내용이 변경되는 것이 안고, 내용이 합쳐진 새로운 String 인스턴스를 생성한다.

3-1. String 인스턴스를 생성하는 2가지 방법

①String str1 = new String("Simple String");

  • new 할 때마다 새로운 인스턴스가 생성된다.
  • 인스턴스 값이 같아도 같은 인스턴스를 참조하지 않음. (다른 인스턴스를 가리킴)

②String str2 = "The Best String";

  • 먼저 생성한 인스턴스의 값을 새로운 참조변수에 저장할 수 있음.(같은 인스턴스를 가리킴)

두 방법 다 Sring 인스턴스의 생성으로 이어지고, 그 결과 인스턴스의 참조 값이 반환된다.

3-2. 아래의 결과가 나오는 이유

String str1 = "Simple String";
String str2 = "Simple String";
 
String str3 = new String("Simple String");
String str4 = new String("Simple String");
 
if(str1 == str2)
System.out.println("str1과 str2는 동일 인스턴스 참조");
else
System.out.println("str1과 str2는 다른 인스턴스 참조");
 
if(str3 == str4)
System.out.println("str3과 str4는 동일 인스턴스 참조");
else
System.out.println("str3과 str4는 다른 인스턴스 참조");

[결과]
str1과 str2는 동일 인스턴스 참조
str3과 str4는 다른 인스턴스 참조

이유

  • str1 / str2 : String 함수는 ""를 이용하여 객체를 생성하면 Method Area에 한 번만 올라가기 때문에 여러 개의 참조변수가 하나의 String 인스턴스를 참조하게 된다.

  • st3 / st4: 서로 다른 객체를 생성했기 때문에 다른 인스턴스를 참조

3-3. 불변(immutable)이란?

  • 객체가 immutable 한다는 것은 객체가 생성된 시점 이후 내부 데이터의 값을 변경할 수 없다는 뜻.
    (데이터 멤버가 final로 선언되어 있다.)
  • 객체를 처음 만들었을 때의 속성을 해당 객체가 사라질 때까지 그대로 유지한다.
    불변 클래스 종류 : String, Boolean, Integer,Float, Long등

4. String 이 immutable 에 대하여 설명하시오.

String str = "최초 문자열";
str = "변경된 문자열";
  • str 이라는 String 객체가 생성된 이후 "최초 문자열" 을 "변경된 문자열" 로 바꾼다고 해도 내부적으로는 최초 생성된 String 객체의 값이 변경되는 것이 아니라 새로운 String 객체가 생성되어 그 참조가 str 변수에 할당된 것.

  • String은 값을 바꾸는 것이 불가능할뿐더러 당연히 값을 바꾸는 메소드 또한 제공되지 않는다.(getter / setter)

  • Java는 문자열을 표현할 때마다 생성되는 인스턴스의 수를 줄이기 위해 동일한 문자열로 구성되는 String 인스턴스의 수를 1개로 제한한다. 그리고 이를 통해 발생할 수 있는 문제를 방지하기 위해 String 인스턴스의 값 변경을 허용하지 않는다.

5. equals 메소드

public class StringTest {
	public static void main(String[] args) {
		String str1 = "Simple String"; // Method Area에 한번만 올라가서 공유
		String str2 = "Simple String";

		String str3 = new String("Simple String");
		String str4 = new String("Simple String");

		if(str1.equals(str3)) { // 문자열이 동일한지 확
			System.out.println("str1과 str3는 동일한 문자열");
		}else {
			System.out.println("str1과 str3는 다 문자열");
		}
	}
}

equals(); 과 == 의 차이

  • equals()는 메소드 / == 는 비교를 위한 연산자
  • equals()는 비교하고자 하는 대상의 내용 자체를 비교 /
    == 는 비교하고자 하는 대상의 주소값을 비교

5-1. abcde를 역순으로 화면에 출력하는 프로그램을 작성하시오.

문자열대로 출력
String 객체에 있는 length() 와 함수와 charAt() 함수를 활용하시오.


public class StringTest {

	public static void main(String[] args) {
		String str = "abcde";

		for (int i = 0; i < str.length(); i++) {
			System.out.print(str.charAt(i));
		}

	}

}

문자열 반대로 출력
입력 : abcde
출력 : edcba


public class String1 {

	public static void main(String[] args) {
		String str = "abcde";
		String reverse = "";

		for (int i = str.length() - 1; i >= 0; i--) {
			reverse = reverse + str.charAt(i);
		}
		System.out.println(reverse);
	}
}

0개의 댓글