Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 게시글 목록 api
- 스프링 mvc2 - 로그인 처리
- 자바의 정석 기초편 ch11
- 자바의 정석 기초편 ch8
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch12
- 자바의 정석 기초편 ch6
- jpa - 객체지향 쿼리 언어
- 자바의 정석 기초편 ch4
- 스프링 mvc2 - 검증
- 2024 정보처리기사 수제비 실기
- 스프링 db2 - 데이터 접근 기술
- 스프링 mvc1 - 스프링 mvc
- 자바의 정석 기초편 ch3
- 스프링 db1 - 스프링과 문제 해결
- 타임리프 - 기본기능
- 2024 정보처리기사 시나공 필기
- 자바의 정석 기초편 ch9
- 자바의 정석 기초편 ch5
- 스프링 mvc1 - 서블릿
- 자바의 정석 기초편 ch2
- 스프링 고급 - 스프링 aop
- @Aspect
- 스프링 mvc2 - 타임리프
- jpa 활용2 - api 개발 고급
- 자바의 정석 기초편 ch14
- 자바의 정석 기초편 ch1
- 스프링 입문(무료)
- 자바의 정석 기초편 ch7
- 자바의 정석 기초편 ch13
Archives
- Today
- Total
나구리의 개발공부기록
자바의 정석 기초편 ch6 - 9 ~ 13[클래스의 정의,선언위치변수종류,클래스변수,인스턴스변수] 본문
유튜브 공부/JAVA의 정석 기초편(유튜브)
자바의 정석 기초편 ch6 - 9 ~ 13[클래스의 정의,선언위치변수종류,클래스변수,인스턴스변수]
소소한나구리 2023. 11. 15. 14:341) 클래스의 정의
- 설계도
- 데이터 + 함수
- 사용자 정의 타입 - 원하는 타입(클래스)을 직접 만들 수 있음
1. 변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나로 저장할 수 있는 공간
3. 구조체 : 서로 관련된 여러 데이터(종류에 상관없이)를 하나로 저장할 수 있는 공간(C언어에 있음)
4. 클래스 : 서로 관련된 데이터와 함수의 결합(구조체 + 함수)
(1) 시간을 다루는 타입을 만든다는 가정의 예제
- 비 객체지향적인 코드 예시
- 변수 선언이 굉장히 많음
//시, 분, 초 3가지의 값을 저장하기위해 변수 선언
int hour;
int minute;
int second;
// 3개의 시간을 다루기 위해 9개의 변수 선언 -> 처음보다 복잡해짐
int hour1,hour2,hour3;
int minute1,minute2,minute3;
int second1,second2,second3;
// 더 많은 시간을 다루기 위해 배열을 선언
// 시간은 시,분,초를 같이 묶어야 하는데 아래의 배열은 시간끼리,분끼리,초끼리 묶여있는 문제 발생
int[] hour = new int[4];
int[] minute = new int[4];
int[] second = new int[4];
- 객체지향 적인 코드로 위의 문제를 해결 -> 코드가 간결해지고 시,분,초를 하나의 클래스로 선언하여 객체를 생성하여 시, 분, 초를 사용
- 객체를 생성하여 참조 변수에 할당하면 되기 때문에 변수 선언이 눈에띄게 줄어듦
- 다뤄야 할 시간이 많아지면 많아질수록 객체지향적인 코드의 장점이 빛을 발휘함
// 시,분,초라는 변수를 묶어서 Time이라는 클래스(사용자정의타입)를 정의(선언)
class Time {
int hour;
int minute;
int second;
}
// 3개의 변수 선언을 아래 처럼 하나의 객체를 생선하는 것으로 변경
// Time = 시,분,초 3개의 변수를 하나로 묶은 것이기 때문에 기존 코드와 거의 동일한 코드가 됨
Time t = new Time();
// 9개의 복잡한 변수 선언을 아래처럼 간단히 변경
// 타임 객체를 3개 만듦
Time t1 = new Time();
Time t2 = new Time();
Time t3 = new Time();
// 배열을 객체의 배열로 변경
// 시,분,초가 따로 묶이는 것이 아닌 시,분,초가 하나로 묶인 배열이 탄생
Time[] t = new Time[4];
t[0] = new Time();
t[1] = new Time();
t[2] = new Time();
t[3] = new Time();
(2) 객체지향적인 코드
- 왼쪽 코드나 오른쪽 코드나 3개의 저장공간이 있다는 점은 같지만 오른쪽이 객체지향적인 코드
- 자바와 같은 객체지향언어에서는 오른쪽 처럼 객체지향적으로 코드를 작성하는것이 좋은데 유지보수 용이성, 코드의 가독성, 높은 응집도 등 다양한 장점을 활용할 수 있음
2) 선언위치에 따른 변수의 종류
- 2개의 영역과 3개의 변수 종류
- 클래스 내부에서 메서드 영역 외의 영역은 클래스 영역이라고 보면 됨
- 선언문의 순서는 상관 없지만 일반적으로 변수를 먼저 선언하고 메서드를 작성함
(1) 클래스영역
- iv (instance variable; 인스턴스 변수)
- 인스턴스가 생성 되었을 때 생성(객체 생성)
- 객체 = iv를 묶어 놓은 것
- 객체를 꼭 생성 해야 사용할 수 있음
- cv (class variable; 클래스변수, 스태틱변수, 공유 변수) = static + iv
- 클래스가 메모리에 올라갈 때 생성(클래스가 필요할 때)
- 자동으로 만들어지므로 객체 생성을 하지 않아도 되며 아무 때나 사용 가능 하며 모든 인스턴스가 공유하는 변수라고 이해하면 됨
- iv변수에 static이 붙으면 cv
- 클래스 영역에는 선언문만 가능(일반 문장들은 들어갈 수 없음)
(2) 메서드 영역
- lv (local variable; 지역 변수)
- 변수 선언문이 수행 되었을 때 생성되고 메서드가 끝나면 자동으로 제거됨
- 메서드 정의시 입력하는 파라미터(매개변수)도 지역 변수의 일종임
- 해당 메서드 영역 안에서만 사용가능한 변수
class variables
{ // 클래스영역의 시작
int iv; // 인스턴스 변수
static int cv; // 클래스 변수(static 변수, 공유변수)
void method()
{ // 메서드영역의 시작
int lv = 0;
} // 메서드영역의 끝
} // 클래스영역의 끝
3) 클래스 변수와 인스턴스 변수
(1) 인스턴스 변수
- 객체의 속성 중 개별적인 속성
- 각 객체마다 생성 되므로 객체마다 데이터가 다름
- 인스턴스 변수는 참조변수를 통해 사용함
(2) 클래스(스태틱) 변수
- 객체의 속성 중 공통적인 속성
- 공유 하는 것이기 때문에 따로 1개만 생성함
- 메모리 공간을 절약할 수 있음
- 클래스변수는 클래스명을 통해 사용함
class Card {
// 개별 iv
String kind; // 무늬
int number; // 숫자
// 공통 cv
static int width = 100; // 폭
static int height = 100; // 높이
}
// 클래스를 사용하는 방법
Card c = new Card(); // 객체 생성
// iv 객체 사용 (참조변수.iv)
c.kind = "HEART";
c.number = 5;
// cv 객체 사용 -> 에러가 안나지만 가급적 아래의 원래 사용방법으로 사용 권장
c.width = 200;
c.height = 300;
// cv 사용의 원래 방법 (클래스이름.cv) -> iv와 혼동할 수 있음
Card.width = 200;
Card.width = 300;
** github 에서 다운 받은 플래시(MemberVar.exe) 보고 이해하기
-> 코드를 보고 코드가 작동하는 구성을 그리면서 이해
(3) 실습
class ex6_3 {
public static void main(String args[]) {
// 객체 생성 없이 바로 cv는 사용 가능
System.out.println("Card.width = " + Card.width);
System.out.println("Card.height = " + Card.height);
System.out.println();
// iv 사용 = 객체 생성 후 사용
Card c1 = new Card();
c1.kind = "heart";
c1.number = 7;
Card c2 = new Card();
c2.kind = "Spade";
c2.number = 4;
System.out.println("c1은 "+ c1.kind + ","
+c1.number+"이며, 크기는("+Card.width+","+Card.height+")");
System.out.println("c2은 "+ c2.kind + ","
+c2.number+"이며, 크기는("+Card.width+","+Card.height+")");
System.out.println();
// c1.width로 사용해도 되지만, iv로 헷갈릴 수 있기 때문에 Card.width로 작성
Card.width = 50;
Card.height = 50; // 위와 동일
System.out.println("c1은 "+ c1.kind + ","
+c1.number+"이며, 크기는("+Card.width+","+Card.height+")");
System.out.println("c2은 "+ c2.kind + ","
+c2.number+"이며, 크기는("+Card.width+","+Card.height+")");
}
}
// Card 클래스(변수 작성)
class Card {
String kind; //iv
int number; //iv
static int width = 100; //cv
static int height = 250; // cv
}
** 출처 : 남궁성의 정석코딩_자바의정석
'유튜브 공부 > JAVA의 정석 기초편(유튜브)' 카테고리의 다른 글
자바의 정석 기초편 ch6 - 20 ~ 22[return문, 반환값,호출스택] (0) | 2023.11.16 |
---|---|
자바의 정석 기초편 ch6 - 14 ~ 19[메서드란? 메서드의 선언부와 구현부, 메서드호출,메서드의 실행 흐름] (0) | 2023.11.15 |
자바의 정석 기초편 ch6 - 5 ~ 8[한파일에 여러 클래스 작성하기,객체의 생성과 사용, 객체의 배열] (1) | 2023.11.14 |
자바의 정석 기초편 ch6 - 1 ~ 4[객체지향언어,클래스와 객체] (0) | 2023.11.14 |
자바의 정석 기초편 ch5 - 18 ~ 24[2차원 배열, 2차원배열 예제, Arrays로 배열 다루기] (0) | 2023.11.13 |