728x90
객체
- 기능을 수행하는 데이터의 단위
객체 지향 프로그래밍 vs 절차 지향 프로그래밍
- 객체 지향 프로그래밍
- 객체 간의 관계가 존재
- 객체의 속성, 기능, 협력 구현 필요
- 존재하는 것을 추상화한 뒤 코드화를 진행
- 대표 언어 : C++, java
- 절차 지향 프로그래밍
- 시간의 흐름에 따른 프로그래밍
- 컴퓨터의 작업 처리 방식과 유사
- 컴퓨터의 처리구조와 유사해 실행속도가 빠름
- 대표 언어 : C
⭐️ 객체 지향의 반대가 절차 지향, 절차 지향의 반대가 객체 지향은 아니다!
Ref.
함수
public class FunctionTest {
public static int addNum(int num1, int num2) {
int result;
result = num1 + num2;
return result;
}
public static void sayHello(String greeting) {
System.out.println(greeting);
}
public static int calcSum() {
int sum = 0;
for(int i = 0; i <= 100; i++){
sum += i;
}
return sum;
}
public static void main(String[] args) {
int n1 = 10;
int n2 = 20;
int total = addNum(n1, n2);
System.out.println(total);
}
}
함수 호출과 스택 메모리
- 프로그램은 함수 호출시, 콜 스택의 개념을 이용한다.
- 함수를 모두 사용한 뒤에는 해당 공간이 해제된다.
- 스택에 저장되는 것들
- 지역 변수
- 매개변수(Arguments)
- 호출한 함수(caller)의 스택에 대한 정보
- 반환값 주소(return address)
Ref.
함수 vs 메서드
- 함수
- 단독 모듈
- 호출해서 사용
- 메서드
- 클래스 내부에 구현
- 클래스 멤버 변수를 사용해서 구현
- ⭐️ 메서드 명명은 그 객체를 호출하는 객체(클라이언트)에 맞게 명명하는 것이 좋다!
객체 생성
- 객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다.
- 클래스를 기반으로 생성되는 새로운 객체 : 인스턴스
- 여러개의 인스턴스가 생성된다.
인스턴스 생성과 힙 메모리
- 인스턴스
- 객체의 속성을 정의한 클래스에 대한 기능을 구현한 객체
- 힙 메모리
- C의
malloc
, C++의new
를 통해 생성된 공간과 동일 - C와 C++은 수동으로 해제시켜줘야함
- java는 gabage collector가 자동 수행
- 필요할 때 동적으로 할당하는 메모리
- C의
- 인스턴스(생성자)는 힙 메모리에 생성된다.
생성자
- 필요에 따라서 생성자를 구현
- 구현하지 않을 경우 컴파일러에 의한 디폴트 생성자 생성
- 보통 객체 생성시, 변수나 상수 초기화를 위해 사용
- 디폴트 생성자의 생성은 필요 여하에 따라 결정
| Student.java
public class Student {
public int studentNumber;
public String studentName;
public int grade;
public Student() {}
public Student(int studentNumber, String studentName, int grade) {
this.studentNumber = studentNumber;
this.studentName = studentName;
this.grade = grade;
}
public String showStudentInfo() {
return studentName + "학생의 학번은 " + studentNumber + "이고, "+ grade +"학년 입니다.";
}
}
| StudentTest.java
public class StudentTest {
public static void main(String[] args) {
Student studentLee = new Student();
System.out.println(studentLee.showStudentInfo());
Student studentKim = new Student(123456, "Kim", 3);
System.out.println(studentKim.showStudentInfo());
}
}
접근 제어 지시자(access modifier)
- private : 동일 클래스
- default : 동일 패키지
- protected : 동일 패키지, 상속 관계
- public : 어디서나
get(), set() 메서드
private
로 선언된 멤버 변수에 접근하여 수정할 수 있는public
으로 제공- get() 메서드만 제공되는 경우는 read-only 필드이다.
private
로 지정하는 이유 : 외부에서 접근 가능한 정보를 최소한으로 오픈함으로써 객체의 오류를 방지하고 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.
캡슐화(encapsulation)
- 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 한다.
- 각각의 메서드나 멤버 변수를 접근함으로써 발생하는 오류를 최소화 한다.
| MakeReport.java
public class MakeReport {
StringBuffer buffer = new StringBuffer();
private String line = "===========================================\n";
private String title = " 이름\t 주소 \t\t 전화번호 \n";
private void makeHeader()
{
buffer.append(line);
buffer.append(title);
buffer.append(line);
}
private void generateBody()
{
buffer.append("James \t");
buffer.append("Seoul Korea \t");
buffer.append("010-2222-3333\n");
buffer.append("Tomas \t");
buffer.append("NewYork US \t");
buffer.append("010-7777-0987\n");
}
private void makeFooter()
{
buffer.append(line);
}
public String getReport()
{
makeHeader();
generateBody();
makeFooter();
return buffer.toString();
}
}
| MakeReportTest.java
public class MakeReportTest {
public static void main(String[] args){
MakeReport builder = new MakeReport();
String report = builder.getReport();
System.out.println(report);
}
}
StringBuffer
,StringBuilder
로 String 값을 연결한다.- 보통 객체 배열을 for을 돌리면서 값을 반복적으로 꺼내오면서 사용
this
- 인스턴스 자신의 메모리를 가짐
- 생성자에서 다른 생성자를 호출 할때 사용
- 생성자를 호출해서 멤버 변수 세팅
- 보통 파라미터가 적은 생성자에서 파라미터가 많은 생성자를 호출할 때 사용
- 생성자에서
this
를 이용해서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음
- 자신의 주소값 반환
public class Person {
String name;
int age;
public Person(){
// int num = 10;
// name = "test"; Error !
this("no name", 1); // 다른 생성자 호출
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person showPerson(){
System.out.println(name+ ", "+age);
return this; // this 자체를 반환하면 주소값이 반환됨
}
public static void main(String[] args){
Person person = new Person();
System.out.println(person.showPerson());
}
}
728x90
'🧑💻 Language > Java' 카테고리의 다른 글
[Java] 객체 지향 프로그래밍(3) (0) | 2022.04.26 |
---|---|
[Java] 객체 지향 프로그래밍(2) (0) | 2022.04.19 |
[Java] Basic Java (2) (0) | 2022.04.04 |
[Java] Basic Java (1) (0) | 2022.03.29 |
[Java] 멀티스레드 (0) | 2021.10.18 |