자바의 정석 기초편 - 객체지향개념 공부(1)

인영·2022년 11월 3일
0

자바의 정석

목록 보기
1/6

국비 개발 학원 수료 2일차...
자바의 정석 유튜브 강의로 한번 더 공부하고 기초를 다지려고 한다! 파이팅

객체지향 언어

코드의 재상용성이 높고 유지보수 용이, 중복 코드 제거
객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)
1. 캡술화 2. 상속 3. 추상화 4. 다형성


클래스와 객체

클래스객체
제품 설계도제품
TV 설계도TV

클래스의 정의 객체를 정의해 놓은 것
클래스의 용도 객체를 생성하는데 사용
객체의 정의 실제로 존재하는 것. 사물 또는 개념
객체의 용도 객체가 가지고 있는 기능과 속성에 따라 다름

객체와 인스턴스

객체: 모든 인스턴스를 대표하는 일반적 용어
인스턴스: 특정 클래스로부터 생성된 객체(예: Tv인스턴스)

클래스 ---(인스턴스화)---> 인스턴스(객체)

1. 클래스 작성

class Tv {
	String color;
    boolean power;
    int channel;
    
    void power() {power = !power;}
    void channelUp() {channel++;}
    void channelDown() {channel--;}
}

2. 객체의 생성

같은 클래스라면 참조변수 생략 가능
static 메서드는 객체 생성 없이 호출 가능

클래스명 변수명; // 클래스와 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스와 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t = new Tv(); 
// Tv클래스 타입의 참조변수 t를 선언, Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

3. 객체의 사용

변수와 메서드를 사용한다는 것

t.channel = 7; // tv인스턴스의 멤버변수 channel의 값을 7로 저장
t.channelDown(); // tv인스턴스의 메서드 channelDown()을 호출

클래스의 정의


1. 변수: 하나의 데이터를 저장할 수 있는 공간
2. 배열: 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
3. 구조체: 서로 관련된 여러 데이터(종류 관계X)를 하나로 저장할 수 있는 공간
4. 클래스: 데이터와 함수의 결합(구조체+함수)

클래스

- 설계도
- 데이터+함수
- 사용자 정의 타입 (원하는 타입을 직접 만들 수 있다.)

선언위치에 따른 변수의 종류

class Variables{ // 1. 클래스 영역 (변수선언, 선언문만 가능, 순서는 상관없음)
	int iv; // 인스턴스 변수
    static int cv; // 클래스 변수(static변수, 공유변수)
    
    void method(){ // 2. 메서드 영역 (메서드 선언)
    	int lv = 0; // 지역변수
   }
}

클래스 영역
1. 클래스 변수 (생성시기: 클래스가 메모리에 올라갈 때 (클래스가 필요할 때))
2. 인스턴스 변수 (생성시기: 인스턴스가 생성되었을 때)

클래스 영역 이외의 영역 (메서드, 생성자, 초기화 블럭 내부)
1. 지역 변수 (생성시기: 변수 선언문이 수행되었을 때)

🔅 객체 = 인스턴스 변수를 묶어놓은 것
🔅 클래스 변수는 객체 생성 필요 x (아무때나 사용 가능)
🔅 인스턴스 변수는 객체 생성 필요 O (객체 생성을 해야만 사용 가능)


클래스 변수와 인스턴스 변수

인스턴스 변수 -> 개별
클래스 변수 -> 공통

class Card {
	String kind; // 무늬
    int number; // 숫자
    
    static int width = 100; // 폭
    static int height = 250; // 높이
}

클래스 변수 같은 경우 참조변수로 사용하는 건 권장하지 않는다. 클래스이름.변수이름으로 사용한다.

Card c = new Card();
c.kind = "HEART";
c.number = 5;
Card.width = 200;
Card.height = 300;

메서드

  1. {문장들}을 묶은 것(작업단위)
  2. 값(입력)을 받아서 처리하고, 결과를 반환(출력)
  3. 클래스 안에 (메서드와 함수는 비슷하지만 함수는 클래스에 독립적이다)
  4. 장점: 중복코드제거, 관리 용이, 재사용가능
  5. 하나의 메서드는 한 가지 기능만 수행하도록 작성
메서드 = 선언부 + 구현부
int add(int x, int y) // 선언부
{ // 구현부
	int result = x + y;
    return result; // 호출한 메서드로 결과를 반환한다.
    // return x + y; 위의 두 줄을 이와 같이 한 줄로 간단히 작성할 수 있다.
}
반환할 것이 없을 땐 void int add로 선언한다.

메서드 호출

메서드이름(1,2, ...); // 메서드를 호출하는 방법
print99andAll(); // void print99danAll()을 호출
int result = add(3, 5); //int add(int x, int y)를 호출하고, 결과를 result에 저장

return문

실행 중인 메서드를 종료하고 호출한 곳으로 되돌아간다.

void printGugudan(int dan) {
	if!(2 <= dan && dan <= 9))
    	return; // dan의 값이 2~9가 아닌 경우, 호출한 곳으로 그냥 되돌아 간다.
    
    for(int i=1; i<=9; i++) {
    	System.out.printf("%d * %d = %d%n", dan, i, dan*i);
    }
    return; // 반환 타입이 void이므로 생략가능. 컴파일러가 자동추가
}

반환타입이 void가 아닌 경우, 반드시 return문 필요.
return문 옆에 반환값은 타입이 일치하거나 자동형변환이 가능한 값이여야 한다.

int multiply(int x, int y) {
	int result = x * y;
    return result; // 반환 타입이 void가 아니므로 생략 불가, 반환값 = result
}
int max(int a, int b) {
	if(a > b)
    	return a; // 조건식이 참일 때 실행된다.
    else
    	return b; // 조건식이 거짓일 때 실행된다.
}

호출 스택(call stack)


스택(stack): 밑이 막힌 상자. 위에 차곡차곡 쌓인다.

호출 스택(call stack)

메서드 수행에 필요한 메모리가 제공되는 공간
메서드가 호출되면 호출스택에 메모리 할당, 종료되면 해체
(아래 있는 메서드(main)가 위의 메서드(Println)를 호출한 것
맨 위의 메서드 하나만 실행 중, 나머지는 대기중

0개의 댓글