- Today
- Total
Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 트러블슈팅
- function
- PLSQL
- 워스프레스
- 문제해결
- JSP
- 프로시저
- 환경세팅
- 오류해결
- wordpress
- dbeaver
- iframe
- javascript
- 이클립스
- 워드프레스
- Oracle
- 엘리멘터
- PROCEDURE
- 클론코딩
- 오라클
- Hostinger
- 함수
- 배열
- sql
- pl/sql
- 자바스크립트
- spring boot
Archives
개발 공부중
[TIL] 클래스와 인스턴스 본문
학습목표 : 인스턴스화를 설명할 수 있다.
우선, 클래스와 객체
클래스는 붕어빵 기계, 객체는 붕어빵에 비유할 수 있다.
클래스는 직접 사용할 수 없다. 클래스의 특징과 기능을 사용하기 위해서는 객체를 만든 후 사용해야된다.
클래스의 생성자로 객체를 만드는 과정을 인스턴스화 라고 한다.
*클래스의 객체 생성 방법
Car c = new Car(); // 클래스명 참조변수명 = new 생성자();
생성자는 반드시 클래스명과 동일한 이름이고, 리턴 타입이 없다.
* 객체 활용방법
c.print(); //참조 변수명.메소드명() //참조 변수명.필드명
두번째, 필드와 지역변수
필드는 설정하지 않아도 0, false, null로 초기화가 된다. 힙 영역에 위치하기 때문이다.
지역변수는 직접 초기화를 해줘야한다. 스택 영역이라 그렇다.
public class DeptVO {
int deptno; //부서번호 선언시 초기값은 0
String dname; //부서명 참조형 선언시 초기값은 null
String loc; //지역명 참조형 선언시 초기값은 null
public class DepyVOMain {
public static void main(String[] args) {
DeptVO deptVO = new DeptVO();
deptVO.deptno = 10;
deptVO.dname = "개발1팀";
System.out.println(deptVO.deptno); // 10
System.out.println(deptVO.dname); // 개발1팀
deptVO = new DeptVO(); // ☆ 변수 선언이 아니라 객체생성임!! ☆
System.out.println(deptVO.deptno); // ☆ 0 으로 초기화됨 ☆
System.out.println(deptVO.dname); // ☆ null 으로 초기화됨 ☆
deptVO.deptno = 30;
deptVO.dname = "개발2팀";
System.out.println(deptVO.deptno); // 30
System.out.println(deptVO.dname); // 개발2팀
}
}
세번째, 메서드
클래스의 기능에 해당한다.
해당 내용은 아래 글 참고
class Param{
int ival; //전역변수는 초기화를 생략할 수 있다. 생성자가 해주니까. non-static // = 0 -> 18번째 줄 100 -> 500
} //but 지역변수는 반드시 초기화가 해야함, 스택에 살아서, 급이 class 급이 아니라서
//선언부에 선언하면 전역변수 인스턴스변수.name << 전역변수
public class TestParam { //선언은 되어 있는데 초기화는 안되어 있다.
void effectParam(Param p){ // p는 주소번지 @abcd1234, p는 지변, (메소드 안에서 선언함) 선언만 되어 있고 생성이 안되어 있어서 (= NullPointerException)
// ☆여기에 p = new Param()이 없으면 결과가 달라진다.☆
p = new Param(); // 막혀있을 때는 paramp가 main안에 17번 원본을 참조함으로 원본을 500으로 초기화함 //p의 주소번지는 @abcd1235!!로 바뀌니까 복제본이 만들어짐으로 0이 500으로 바뀌는 것임 17번에 있는 p와 다름
p.ival = 500; //주소번지p 간접참조방식(사물함에 번호만 가지고 있음)
System.out.println("sub ival ===> " + p.ival);
}
public static void main(String[] args) { //메인스레드가 시작점
TestParam tp = new TestParam(); //인스턴스화 ////500
Param p = new Param(); //6번에서는 선언만 했는데 여기서 생성함!! 원본에는 3번째줄 0이 들어있음 ////0
//p.ival = 100;
tp.effectParam(p); // 17번에서 만든 객체를 18번줄에서 씀 //주소번지 @abcd1234넘긴다 // 여기가 없으면 호출을 안해서 sub이 출력안됨
System.out.println("main ival ===> " + p.ival);
}
}
인스턴스화(Param p = new Param();)를 하면 위치값(주소)가 새로 생성되는 것이다.
Param()생성자로 만든 객체를 힙 메모리에 넣고, 위칫값을 Param타입의 참조변수 p에 저장하라고 표현할 수 있다.
public class String1 {
public static void main(String[] args) {
// String은 2가지로 초기화 가능함 대입연산자와 new를 사용하는 방법이 있음
//s1과 s2의 주소번지는 같음
//s3과 s4의 주소번지가 다름
//s3이 가리키는 문자열 주소번지가 s4와 같은지를 비교하려면 equals()메소드를 활용
//주소번지를 비교할 수 있는 것은 참조형 타입인 경우만 가능
//원시형 변수는 주소번지를 비교할 수 없음
String s1 = "안녕";
String s2 = "안녕";
String s3 = new String("안녕");
String s4 = new String("안녕");
System.out.println("s1과 s2 비교 ====> "+ (s1==s2));
System.out.println("s2과 s3 비교 ====> "+ (s2==s3));
System.out.println("s3과 s4 비교 ====> "+ (s3==s4));
System.out.println("------------------------------");
System.out.println("s1과 s2 내용비교 ====> "+ s1.equals(s2));
System.out.println("s2과 s3 내용비교 ====> "+ s2.equals(s3));
System.out.println("s3과 s4 내용비교 ====> "+ s3.equals(s4));
//String 클래스는 new를 사용하지 않고 객체를 생성하면 이미 같은 값이 존재할 때 기존 값을 참조한다.
//완결편 : 참조형 변수는 new를 사용하므로 무조건 새로운 객체가 만들어진다.
}
}
String은 2가지로 초기화 가능하다. 대입연산자와 new를 사용하는 방법이 있다.
String 클래스는 new를 사용하지 않고 객체를 생성하면 이미 같은 값이 존재할 때 기존 값을 참조한다.
인스턴스화를 하지 않아도 메서드 앞에 static이 붙어 있으면 호출할 수 있다.
참조자료형이 넘겨지면 실제 객체가 전달되는 것이 아니라 객체의 위칫값이 전달되는 것이다.
'JAVA' 카테고리의 다른 글
[JAVA] 피보나치 수열 구하기 (0) | 2022.12.07 |
---|---|
[TIL] 배열 (0) | 2022.12.07 |
[TIL] 변수/ return (1) | 2022.12.02 |
VScode 에서 java 프로젝트 생성하기 (0) | 2022.12.01 |
[TIL] 변수선언 / 디버깅 방법 (0) | 2022.11.29 |
Comments