개발새발
클래스와 객체 Ⅰ 본문
대문자로 쓰여있는건 클래스 단위
sysout 하고 ctrl+스페이스 바 누르면 System.out.println() 이 자동 완성 됨
모듈 체크 박스 해제
객체
물리적으로 존재하거나 추상적으로 생각할 수 있는 것중에서 자신의 속성을 가지며 식별 가능한 것
속성(필드(field))+동작(메소드(method))로 구성
필드는 멤버 변수로 선언
객체의 상호 작용
메소드를 통해 객체들이 상호작용
메소드 호출: 객체가 다른 객체의 기능을 이용하는 것
캡슐화: 관련된 데이터(필드=멤버변수) 와 알고리즘(코드)이 하나의 묶음으로 정리 되어 있는 것
상속: 기존 코드를 재활용하기 위한 기법
다형성: 객체가 취하는 동작이 상황에 따라 달라지는 것
추상화: 불필요한 정보는 숨기고 중요한 정보만을 표현
클래스
자바의 설계도
인스턴스: 클래스로부터 만들어진 객체
객체 지향 프로그래밍 단계
클래스 설계-> 설계된 클래스로 사용할 객체 생성-> 객체 이용
클래스로부터 객체를 생성
new 클래스();
위에 꺼를 생성자라고 부름
new 연산자로 메모리 힙 영역에 객체 생성
객체 생성 후 객체 번지가 리턴
참조 변수에 저장하여 변수 통해 객체 사용 가능
자바 메모리 영
참조변수(객체 변수)는 스택 영역에 저장되고, new 연산자를 통해 만든 객체는 힙 영역에 저장됨
메소드 영역-클래스 관련
힙 영역-객체, 배열
스택 영역-지역변수들
기본 타입에 저장된 변수들은 스택 영역에 저장 되고, 참조 타입에 저장된 변수들은 힙 영역에 저장된다
클래스의 구성 멤버
필드 선언
클래스 중괄호 블록 어디서든 존재 가능
필드는 클래스의 내부이면서, 생성자와 메소드 밖에서 정의
초기값을 지정하지 않는 필드는 객체 생성 시 자동으로 기본 초기값 설정
(필드에서 선언된 변수는 지역 변수와는 다르게 값을 할당하지 않아도 자동으로 초기값을 갖는다, 지역 변수는 초기화를 하지 않으면 에러 남)
필드 사용
필드 값을 읽고 변경하는 작업
클래스 내부 생성자 및 메소드에서 사용하는 경우: 필드 이름으로 읽고 변경
클래스 외부에서 사용하는 경우: 클래스로부터 객체 생성 한 뒤 필드 사용
package sec01;
public class Student {
// 필드 선언
// 국적, 이름, 나이, 학과
String nation;
String name;
int age;
String dept;
// 메소드 (설정자)
void setName(String name) {
this.name = name;
}
void setAge(int age) {
this.age = age;
}
void setDept(String dept) {
this.dept = dept;
}
// 메소드 (접근자)
String getName() {
return name;
}
int getAge() {
return age;
}
String getDept() {
return dept;
}
}
setter에서 this 키워드를 쓴 것은 name=name; 으로 멤버 변수와 지역변수가 이름이 같을 경우에는 지역변수에 우선권을 주기 때문에 지역변수를 지역 변수에 할당하는 의미 없는 코드가 되기 때문이다.
// 세터 (값을 설정/변경)
void setName(String name) {
this.name = name;
}
클래스 외부에서 사용하는 경우
메인 메소드에서 객체를 생성 후 실행 가능
package sec01;
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student();
//객체 생성 후 참조 변수 s1로 접근 가능
s1.setName("자바신");
s1.setAge(20);
}
}
생성자
클래스로부터 new 연산자로 객체를 생성할 때 호출 되어 객체의 초기화를 담당
생성자는 메소드와 비슷하나, 리턴 타입이 없고 클래스 이름과 반드 동일함
기본생성자
클래스 내부에 생성자 선언을 생략할 경우 바이트 코드에 자동 추가
Student s1 = new Student();
//여기서 Student() 가 기본 생성자
생성자 선언
개발자가 생성자를 명시적으로 선언 가능, 생성자를 선언하면 기본 생성자는 생성 되지 않음
클래스에 생성자가 명시적으로 선언 되었을 경우 반드시 선언 된 생성자를 호출하여 객체 생성
매개 변수 이름은 필드 이름과 유사하거나 동일한 것 사용 권장
필드와 매개 변수 이름이 완전히 동일할 경우 this.필드로 표현
생성자 오버로딩: 다양한 방법으로 객체의 초기화
오버로딩 조건: 매개 변수의 타입, 개수가 달라야 함
다른 생성자 호출: this()
생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 문제 발생을 해결
오버로딩(Overloading)
오버로딩은 같은 이름의 메서드를 여러 개 정의할 수 있게 하는 기능으로, 메서드의 매개변수 개수나 타입이 다를 때 가능하다. 이는 컴파일러가 매개변수의 타입과 개수를 기준으로 적절한 메서드를 선택하도록 한다.
특징
메서드 이름은 동일해야 한다.매개변수의 타입, 개수, 순서가 달라야 한다.반환 타입은 오버로딩 조건에 영향을 주지 않는다.
컴파일 타임(compile-time)에 어떤 메서드를 호출할지 결정된다.
class MathUtils {
// 오버로딩된 메서드들
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
int add(int a, int b, int c) {
return a + b + c;
}
//위 예제에서 add라는 이름의 메서드가 매개변수 타입과 개수에 따라 여러 번 정의됨.
}
생성자 오버로딩의 개수가 많아지면 중복된 코드가 많아질 수 있기 때문에 this 키워드로 간결하게 쓰자
this()를 사용하면 같은 클래스 내의 다른 생성자를 호출할 수 있는데, 반드시 생성자 블록의 첫 줄에 위치해야 한다.
// 생성자
Student(String name, int age) {
// this.name = name;
// this.age = age;
this(name, age, "소공");
}
Student(String name, int age, String dept) {
this.name = name;
this.age = age;
this.dept = dept;
}
Java에서 생성자가 여러 개 정의되어 있다면, 각 생성자는 상황에 따라 독립적으로 호출될 수 있다. 즉, 마지막 생성자만 사용할 수 있는 것이 아니라, 객체 생성 시 호출되는 생성자는 매개변수의 개수와 타입에 따라 결정된다.
생성자를 명시적으로 선언하면 기본 생성자가 만들어지지 않기 때문에 그대로 실행하려고 하면 오류가 뜬다.
class Student {
String name;
int age;
// 사용자 정의 생성자
Student(String name, int age) {
this.name = name;
this.age = age;
}
}
public class Main {
public static void main(String[] args) {
// 기본 생성자를 호출하려고 하면 컴파일 오류 발생
Student s1 = new Student(); // 에러: 기본 생성자가 정의되지 않음
}
}
class Student {
String name;
int age;
// 사용자 정의 생성자
Student(String name, int age) {
this.name = name;
this.age = age;
}
// 기본 생성자 추가
Student() {
this.name = "Unknown";
this.age = 0;
}
}
public class Main {
public static void main(String[] args) {
// 기본 생성자 호출 가능
Student s1 = new Student();
System.out.println(s1.name + ", " + s1.age); // Unknown, 0
// 사용자 정의 생성자 호출 가능
Student s2 = new Student("Alice", 20);
System.out.println(s2.name + ", " + s2.age); // Alice, 20
}
}
매개 변수의 선언
메소드 실행에 필요한 데이터를 외부에서 받아 저장할 목적
매개 변수의 개수가 명확한 경우 = 그 개수와 타입을 일치시켜야 함
매개 변수의 개수가 명확하지 않은 경우 = 배열 사용
//매개 변수의 개수가 명확하지 않은 경우
package sec01;
public class Score {
int sum1(int[] values) {
int sum = 0;
for (int i = 0; i < values.length; i++) {
sum += values[i];
}
return sum;
}
public class ScoreTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Score s1 = new Score();
int[] values = {10, 20, 30};
int result = s1.sum1(values);
System.out.println("result: " + result);
}
}
}
메소드 오버로딩
- 같은 이름의 메소드를 여러 개 선언
- 목적: 매개값을 다양하게 받아 처리할 수 있도록 하기 위함
- 오버로딩 조건:
- 매개 변수의 개수 또는 타입이 달라야 한다.
- 매개 변수는 같고 리턴 타입이 다른 경우는 오버로딩이 성립되지 않는다!
- 오버로딩된 메소드들은 매개 변수에 의해서만 구별될 수 있다.
- 오버로딩된 메소드 호출하는 경우 JVM은 매개 값 타입 보고 메소드를 선택
- 매개 변수의 타입, 개수가 같은 경우 매개변수 이름 달라도 메소드 오버로딩 아님에 주의
'WEB-STUDY' 카테고리의 다른 글
상속 (0) | 2025.01.03 |
---|---|
클래스와 객체 Ⅱ (0) | 2024.12.31 |
교환학생 중고거래 서비스 최종 발표 (1) | 2024.12.13 |
Flask와 React 연결하기 (0) | 2024.11.21 |
교환학생 중고거래 서비스 중간 발표 (0) | 2024.10.24 |