2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

자바 (Java) 학습 정리 -5

2023. 9. 1. 09:50ㆍJAVA
반응형

클래스와 객체

 

객체

-(소프트웨어 공학 관점) 실제로 존재하거나 생각할 수 있는 것 

-(객체 지향 프로그래밍) 현실에 있는 모드 것은 객체로 만들 수 있음

 

자바에서 객체를 구현하는 방법

- 구현할 대상(객체)를 고려하여 클래스를 정의해야 함

 

왜 클래스로 먼저 정의할까 ? 

- 실존하는 대상인 객체를 잘 만들기 위함

 

클래스

- 객체로 만들 대상의 특징이나 기능을 잘 나타내도록 , 개념적으로 분류 정의

- 정의된 클래스로부터 구체화(구체적으로 만듦) 하면 객체가 됨

 


기본 타입 

- 정수, 실수 , 문자 , 논리 값을 변수로 저장할 때 기본타입으로 분류 

- 메모리 상에서 변수에 값이 직접 저장됨 

 

참조 타입 

- 객체를 변수에 저장할 때 분류하는 타입

- 객체의 메모리 주소(번지)가 변수에 저장됨

- 객체 메모리 주소를 참조 한다는 뜻

 

참조 타입의 종류

- 클래스, 인터페이스, 열거 , 배열

 

 


 

1. 클래스명 정하기

  1. 구현하고자 하는 대상을 ( 머리속으로 ) 객체 구상하기

  2. 객체를 특징, 기능 단위로 분류해서 개념적으로 정의

 

출처 : 프로그래머스 자바 기초 강의

2. 클래스명 .java 파일 만들기

-프로젝트에서 원하는 패키지 경로 안에 새로운 " 클래스명.java"파일을 만듬

- 클래스명과 동일한 이름으로 파일을 생성해야 함

- 대소문자 구분함

 

3. 클래스 선언하기

- 클래스명 뒤에 중괄호 {} 를 붙임

- 클래스 시작과 끝을 하나의 블록으로 구성

- IntelliJ에서 클래스 파일 생성 시 클래스 선언은 자동완성 됨

public class Person {
	
    int age;
    String name;                //필드 : 객체의 속성을 클래스 필드로 설정할 수 있음
    
    Person(String n ) {
    	name = n;                  //생성자 : 처음 객체 생성 시 , 객체 초기화를 담당하는 역할
	}
	int getAge() {
		return age;                 // 메소드 : 객체의 기능 , 동작을 메소드로 제공
	}	

}

 

인스턴스 

 

클래스와 객체에서 빠질 수 없는 인스턴스

 

- 힙 (Heap) 메모리  영역에 객체가 생성됨 

- 정의된 클래스를 바탕으로 객체를 실체화한 것 

 

인스턴스화

- 인스턴스를 만드는 과정 ( 실체화 과정 ) 

 

인스턴스 만들기 

- (선언된 클래스가 있는 상태에서) new 연산자와 함께 클래스명을 호출 

 

* new 연산자 = 힙 메모리 공간에 인스턴스를 생성한 뒤, 생성된 메모리 주소를 반환 

 

인스턴스를 변수에 저장하기

 

-new 연산자로 생성된 인스턴스를 참조변수에 저장

 

Q. 동일한 클래스로 인스턴스를 여러개 만들면 ? 

 

- new 연산자는 새로운 인스턴스와 메모리 주소를 생성해 반환합니다.

 

*** 객체 != 인스턴스 ***

 

- 객체가 인스턴스를 포괄하는 개념

- 인스턴스 : 특정 클래스로부터 메모리에 실체화된 특정 객체

- 객체 : 개념적으로 인스턴스를 모두 포괄하는 정의 

- 예) " A 인스턴스와 B 인스턴스는 모두 객체입니다. "

 

 

메소드(method) 란 ? 

- 객체의 동작을 정의

 

함수 

- 하나의 기능을 수행하는 코드 블록

함수의 장점

1. 코드가 잘 정리되어 보이고, 효율적으로 코드를 작성할 수 있음

2. 원하는 기능을 가진 함수를 필요할 때마다 호출해서 바로 사용할 수 있어 간편함

3. 중복 코드 방지 

 

메소드

- 클래스의 구성요소

- 객체가 가진 하나의 동작을 의미 

- 클래스 안에 구현

 

메소드 선언 

boolean isEqualAge( int a, int b ){
	boolean result = false;
    if ( a == b ){
    	result = true ;
    }
    return result;

메소드의 다른 형태 : 매게 변수가 없는 경우, 반환되는 결과값이 다른 경우도 존재함

 

메소드 호출

 

인스턴스 메소드 호출하기

 

- 일반적으로 외부에서 인스턴스 메소드를 호출할 때 사용 

- 점 연산자(.)를 이용함

 

1. Person 클래스

public class Person {

	void whoAmI() {
    	System.out.println("홍길동 입니다.");
    }
}

2. Person 인스턴스 WhoAmI() 메소드 호출

Person person = new Person();
person.whoAmI();

 

3. 내부 메소드 호출하기

public class Person {
	void whoAmI() {
    	howOld();     //바로 메소드 명으로 호출 가능
        System.out.println("홍길동 입니다.");
    }
    
    void howOld() {
    	System.out.println("20살 입니다.);
        }
}

 


 

필드 : 객체가 가지는 속성을 나타내는 변수

 

객체 속성 : 객체가 가지는 고유한 데이터

 

public class Person{
	String name = "홍길동";                  // 필드 위치
	int age = 20;                          // 필드 위치
    
    int getAge() {
    	return age;
    }
}

필드 작성 위치 : 클래스 실행 블록 바로 아래에 선언하는 것을 권장

 

필드타입 필드명 = 값;

 

인스턴스 필드 호출하기 

- 인스턴스 외부에서 필드를 접근하고자 할 떄 , 점 연산자를 사용

Person person = new person();
System.out.println(person.age);

내부 필드에선 필드명으로 바로 접근가능 


생성자 

- 클래스로부터 객체를 생성할 때, 객체를 초기화함

 

동작순서 

1. new 연산자로 객체 생성 

 - 힙 메모리 상에 객체를 생성하고 , 해당 메모리 주소를 반환 

2. 생성자 호출 

- 객체 생성 시 , 생성자가 반드시 호출됨

- 객체를 초기화

- 객체 내부에서 필요한 필드나 상수 등의 초기값을 설정

 

생성자 선언하기

- 생성자명은 클래스 이름과 같아야 함

- 값을 반환하는 return문을 작성하지 않음

public class Person {
	String name;
	int age;
    
    public Person(String n , int a) {
    	name = n;
        age = a ;
    }
}

public 클래스명 ( 매개변수) {

}  // 생성자 형태

 

 

생성자에 매개변수 전달하기 

- 클래스 호출하는 소괄호 안에 , 선언한 매개변수에 맞춰 인자를 전달

 

public class Person {
	String name;
	int age;
    
    public Person(String n , int a) {   //Person person = new Person("홍길동", 20); 으로 호출
    	name = n;
        age = a ;
    }
}

 

생성자 없이 클래스를 선언하는 경우 " 디폴트 생성자 " 

public class Person {

	String name = "홍길동";
	int age = 20;
}

Person person = new Person();   // 디폴트 생성자

디폴트 생성자

- 클래스 내부에 생성자를 생략한 경우 자바 컴파일러가 디폴트 생성자를 자동 추가함

- 생성자 선언을 생략해도 정상적으로 객체가 생성됨 

 


 

String 클래스 

- 문자열을 구현할 때 사용하는 자바 기본 클래스

- 큰 따옴표 ( " ") 사용

 

사용 예시 

1. String 객체를 직접 생성해서 저장 

- "문자열" 을 String 클래스와 함께 호출해서 String 객체를 직접 생성하는 방식 

String 변수명 = new string (" 문자열 " );

 

String str = new String ("문자열 입니다.");
String newStr = new String ( "문자열 입니다 "); 

System.out.println(str == newStr); // false

 

2. 문자열 그대로 저장 

- String 변수에 "문자열"을 바로 저장하는 방식

String 변수명 = "문자열";

String str = "문자열 입니다.";
String newStr = "문자열 입니다.";

System.out.println(str == nreStr ); //true

 

1번과 2번의 결과가 다른 이유는
1번은 인스턴스를 따로 생성했기 때문에 다른 메모리 주소를 반환하여 다른 값으로 확인됩니다.

 

2번은 힙 메모리 영역의 String pool 에 문자열이 저장됩니다. 그렇기 때문에 동일한 문자열은 동일한 메모리 주소를 반환합니다.

 

2번 방식이 더 좋은 방식입니다. 이유는 메모리 낭비를 줄일 수 있는 방법이기 때문입니다.


String 클래스 메소드 

String a = new String("안녕하세요");
String b = new String("안녕하세요");

System.out.println( a==b ); //false

String 클래스 equals 메소드 

String a = new String ("안녕하세요");
String b = new String ("안녕하세요");
String c = "안녕하세요";

System.out.println(a.equals(b)); //true
System.out.println(a.equals(c)); // true

equals 메소드는 의도한 대로 값을 비교 가능 

같은 문자열이면 true , 다르면 false 반환

 

equals를 사용할 때 권장하는 방식 
-소괄호 안에 null값이 들어갈 수 있는 변수를 넣는 것이 좋습니다.

 

System.out.println(a.equals(b)); // NullPointerExeption
System.out.println(b.equals(a)); // false

null 이 들어간 변수에 equals 메소드를 호출하면 NullPointerException 을 발생 

null 이 들어갈 수 있는 변수는 안전하게 소괄호 안에 넣어서 비교하도록 권장 

 


문자열 합치기


a.concat(b)

a.concat(a)

- 호출한 순서대로 두 문자열을 합침

 

String a = "안녕하세요" ;
String b = " 홍길동 입니다.";

System.out.println(a.concat(b)); // 안녕하세요홍길동입니다.
System.out.println(b.concat(a)); //홍길동입니다. 안녕하세요

하지만 문자열을 합칠 땐 성능 차원에서 + 연산자 사용을 권장

 

 

문자열 자르기

문자열.substring(시작 인덱스,끝 인덱스)

원하늩 위치의 문자열을 가져올 수 있음

- 시작 인덱스부터

- 끝 인덱스 전까지 ( 끝 인덱스의 문자는 포함하지 않음)

 

String str = " 안녕하세요 홍길동입니다.";

System.out.println(str.substring(6,9)); // 홍길동

출처 : 프로그래머스 자바 기초 강의

 

반응형

'JAVA' 카테고리의 다른 글

자바(Java) 학습 정리 -4  (0) 2023.08.30
자바(Java) 학습 정리 -3  (0) 2023.08.24
자바(Java) 학습 정리 2  (0) 2023.08.23
자바(Java) 학습 정리 -1  (0) 2023.08.23
프로그래밍 공부 -1  (0) 2023.06.20