객체지향 프로그래밍(OOP, Object Oriented Programming)
객체지향 프로그래밍의 장단점
용어 정리
Class 구성요소
public class ClassExample {
float x = 10.0f; // 필드 (field)
void methodExample() {...} // 메서드 (Method)
ClassExample() {...} // 생성자
class ExampleClass2 {...} // 이너 클래스 (Inner Class)
}
객체의 생성방법
public class Main {
public static void main(String[] args) {
// 모두 같은 Class를 통해 만들어졌지만 다른 Instance이다.
// (안에 가지고 있는 member들의 값들은 모두 다를 수 있다.)
Car redCar = new Car();
Car buleCar = new Car(); // 선언과 초기화를 동시에 함
Car greenCar; // 선언
greenCar = new Car(); // 할당(초기화)
}
객체의 생성과 메모리 저장 - 추가 내용
Car redCar = new Car();
// Car : 클래스
// redCar : 참조 변수
스택 (메모리) 영역 (Stack Area) :
클래스 영역 (Class Area) :
힙 메모리 영역 (Heap Area) :
객체 생성 한줄 정리
객체 내부값 호출
public class Main {
public static void main(String[] args) {
Car redCar = new Car("red"); // 생성자를 통해 객체 생성
System.out.println(redCar.color); // red / redCar의 color 값을 불러옴
redCar.go(); // 가즈아! / redCar의 매서드 go를 실행
}
class Car{
// 필드
public String color;
// 생성자
public Car(String color) {
this.color = color;
}
// 메서드
void go(){
System.out.println("가즈아!");
}
}
필드 : 클래스에 포함된 변수
클래스 변수(cv, class variable, static 변수): 같은 클래스끼리 공유하는 변수
인스턴스 변수(iv, instance variable): 인스턴스마다 가지는 고유한 값
지역 변수(lv, local variable) : 특정 범위 { } 안에서만 사용 가능
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
필드 사용 예시
public class MyClass {
public static void main(String args[]) {
MathCompanyPeople people1 = new MathCompanyPeople("Steve Lee");
MathCompanyPeople people2 = new MathCompanyPeople("Jim Kim");
// 클래스이름.클래스변수 형태로 값을 설정
MathCompanyPeople.companyName = "MATHCompany";
System.out.println(people1.companyName); // MATHCompany
System.out.println(people2.companyName); // MATHCompany
people1.companyName = "MATHCOMPANT"; // 해당 표현은 추천하지 않음 (공용변수임 뚜렷히 안나타남)
System.out.println(people1.companyName); // MATHCOMPANT
System.out.println(people2.companyName); // MATHCOMPANT
// 인스턴스 변수는 변경시 다른 인스턴스에게 영향을 주지 않음
people1.name = "Gwichan Lee";
System.out.println(people1.name); // Gwichan Lee
System.out.println(people2.name); // Jim Kim
}
}
class MathCompanyPeople{
static String companyName = "MathCompany"; // Class 변수
String name; // Instance 변수
// 생성자
MathCompanyPeople(String name){
this.name = name;
}
}
매서드 : 특정 작업을 수행하는 일련의 명령문들의 집합
// 기본 형태
자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
메서드 내용 // 메서드 바디
}
public class Prac{
// static : 메인 Method 에서 실행하려면, 반드시 static이 있어야 한다.
// 파라미터 X, 반환값 X
public static void simplePrint() {
System.out.println("파라미터도 없고, 반환값도 없어요!");
}
// 파라미터 O, 반환값 X
public static void simpleSum(int num1, int num2) {
System.out.println("num1 :" + num1 + ", num2: " + num2);
}
// 파라미터 X, 반환값 O
public static int simpleReturn() {
return 3;
}
// 파라미터 O, 반환값 O
public static int sum(int num1, int num2) {
return num1 + num2;
}
}
매서드 호출
System.out.println(Prac.simpleReturn());
Prac prac = new Prac();
System.out.println(prac.sum(3,4)); // 7
System.out.println(prac.simpleReturn()); // 3
매서드 오버로딩
// println이 포함된 class 일부
...
public void println(boolean x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(char x) {
synchronized (this) {
print(x);
newLine();
}
}
public void println(int x) {
synchronized (this) {
print(x);
newLine();
}
}
...
생성자 : 인스턴스가 생성될 때, 호출되는 인스턴스 변수 초기화 매서드 (일종의 메서드)
특징
class MathCompanyPeople{
static String companyName = "MathCompany"; // Class 변수
String name; // Instance 변수
int age;
// 기본 생성자
MathCompanyPeople() {} // field 값들이 기본값으로 하고 인스턴스가 생성됨 ex) String은 null ..
// 생성자
MathCompanyPeople(String name, int age){
this.name = name;
this.age = age;
}
// 생성자 오버로딩
MathCompanyPeople(String name){
this.name = name;
}
}
this.
만들어진 해당 객체 안에서 field값을 불러올 때, " this.변수 " 의 형태로 사용
일반적인 경우에는 생략이 가능하다.
this() : 생성자 내부에서 오버로드 된 다른 생성자를 호출하는 방법
public class Main{
public static void main(String[] args) {
MathCompanyPeople people1 = new MathCompanyPeople();
// 기본 생성자 호출!
MathCompanyPeople people2 = new MathCompanyPeople("gwichan Lee", 25);
// 생성자 두번째꺼 호출
// 기본 생성자 호출!
people2.printInfo();
// 이름: gwichan Lee / 나이: 25
}
}
class MathCompanyPeople{
String name;
int age;
MathCompanyPeople() {
System.out.println("기본 생성자 호출!");
}
MathCompanyPeople(String name, int age){
this(); // 같은 매서드 이름(생성자)을 가진 바로 위의 생성자를 호출함
// Class의 field 변수와 메서드 내의 지역변수의 이름이 같을 경우, 반드시 this. 붙여 구분함
this.name = name;
this.age = age;
System.out.println("생성자 두번째꺼 호출");
}
void printInfo(){
System.out.print("이름: " + name); // this. 생략
System.out.print(" / 나이: " + Integer.toString(this.age)); // field값을 불러올 때, " this.변수 " 의 형태로 사용
}
}