클래스와 객체
객체
-(소프트웨어 공학 관점) 실제로 존재하거나 생각할 수 있는 것
-(객체 지향 프로그래밍) 현실에 있는 모드 것은 객체로 만들 수 있음
자바에서 객체를 구현하는 방법
- 구현할 대상(객체)를 고려하여 클래스를 정의해야 함
왜 클래스로 먼저 정의할까 ?
- 실존하는 대상인 객체를 잘 만들기 위함
클래스
- 객체로 만들 대상의 특징이나 기능을 잘 나타내도록 , 개념적으로 분류 정의
- 정의된 클래스로부터 구체화(구체적으로 만듦) 하면 객체가 됨
기본 타입
- 정수, 실수 , 문자 , 논리 값을 변수로 저장할 때 기본타입으로 분류
- 메모리 상에서 변수에 값이 직접 저장됨
참조 타입
- 객체를 변수에 저장할 때 분류하는 타입
- 객체의 메모리 주소(번지)가 변수에 저장됨
- 객체 메모리 주소를 참조 한다는 뜻
참조 타입의 종류
- 클래스, 인터페이스, 열거 , 배열
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 |