종료하기 전 티스토리 네이버 로그아웃 할 것
1. 툴
동일
추가시:
2. 폴더
동일
추가시:
3. 사용할 사이트
동일
추가시:
4. 공부하는 것
Setter랑 Getter 쓰는 이유는
http://devist.tistory.com/128
http://dynamide.tistory.com/1384
에서 참조
class 사람{
int 키 = 170;
int 몸무게 = 60;
}
이라는 클래스를 만들게 될 경우
사람.키와 사람.몸무게로 직접적으로 접근이 가능한데 그러면
아무나 접근을 해서 변경이 가능하기 때문에
클래스의 멤버 필드에는 클래스에서만 접근해서 수정이 가능한 private로 선언을 한다.
그러면
class 사람{
private int 키 = 170;
private int 몸무게 = 60ㅣ
}
이 되는데 이러면 객체에서 키랑 몸무게를 못 바꾸니까
멤버 필드 변수를 변경해주는 기능을 제공해 주는 게 setter와 getter이다.
class 사람{
private int 키 = 170;
private int 몸무게 =60;
public void set 키(int a){
키 = a;
}
public int get키(){
return 키;
}
}
이렇게 하면 get키가 getter고 set키가 setter가 되는데
이러면 키값 변경시
사람 people = new 사람();
people.set키(180);
이런 식으로 객체 값을 변경하고
System.out.println(people.get키());
이런 식으로 객체값을 가져올 수 있다.
이게 좀 불편한데 나중에 프로그램이 커지면 변수에 직접 접근시 오류가 생겼을 경우 발견하기 어려운 걸 방지하기 위해서라고 한다.
그리고 이런 거 이름이 캡슐화.
이거 eclipse에서 Source -> Generate Getters and Setters 하고 변수 체크한 뒤 확인 누르면 만들어지긴 하는데
연습하는 거니까...
그리고 변수명이 name이면
setName 같은 모양으로 만들어주는게 암묵적인 규칙이래...
그리고 한 메소드에 세터 한번에 넣어주는 건 안되는 것 - 따로 쓰라고 쪼개놓은 것...
//잊어버릴까봐: static이 붙은 메소드나 변수는 데이터 영역에 메모리가 할당되는데
이렇게 하면 객체 생성할 필요 없이 클래스를 통해 바로 변수에 접근이 가능하다.
String은 기본형 타입이 아닌데 기본형 같이 생김...
그리고 call by reference임
문자열 타입은 String StringBuffer StringBuilder가 있는데 String만 불변의 특징이 있다.
이게 한번 정한 글자는 바꿀 수가 없는건데
"마우스" -> "마우스다"로 바꾸고 싶으면
그냥 넣어주면 바꾼 것처럼 보이지만
사실 메모리를 새로 잡은거임
그냥 "마우스" +"다" 를 할 수 없고 "마우스" 를 가리키는 해시코드를 "마우스다"를 가리키는 해시코드로 바꿔준거임
그리고 이게 기본형 변수 타입이 아닌 클래스인데도
String name = new String() 이렇게 안 쓰고 String name = "길동이" 이렇게 쓰면 객체화 완료.
그런데 StringBuffer는 StringBuffer sb = new StringBuffer("홍길동") 한 다음에
StringBuffer sb2 = new StringBuffer("홍길동") 이라고 만들면 sb와 sb2가 서로 다른 해시코드값을 가지는데
String은 String name = "홍길동" 과 String name2 = "홍길동"이 가리키는 해시코드값이 동일하다.
(메모리상으로 하나인 것)
어쨌든 만약에 문자열이 계속 변경되는 프로그램이면 스트링버퍼를 써야지 스트링을 쓰면 메모리 낭비가 심하다.
그리고 문자열 비교할 때는 == 쓰지말고 equals를 쓰자
public static void main(String[] args) {
String n1 = "yes";
String n2 = "yes";
System.out.println(((n1==n2) ? n1 : n2));
}
이게 메모리상으로 String은 해시코드값이 동일해서 yes로 나오긴 하는데 equals를 권장한다니까
public static void main(String[] args) {
String n1 = "yes";
String n2 = "yes"; // String n2 = "nop";
System.out.println((n1.equals(n2) ? n1 : n2));
}
그냥 권장하는 대로 이렇게 쓰자.
그리고 대문자랑 소문자 바꿀 수도 있음
public static void main(String[] args) {
String n1 = "yes";
String n2 = "YES";
System.out.println(n1.toUpperCase());
System.out.println(n2.toLowerCase());
}
이렇게 toUpperCase하고 toLowerCase 메소드 쓰면 됨.
-생성자는 곧 제대로 배울 것 같지만 -
이렇게 생김
class Test{
Test(){
} //얘가 생성자
}
배열 정의할 때
Goods goodsArray[] = new Goods[3];
이거는
Goods goodsArray[];
goodsArray = new Goods[3]; 하고 같음
-----------------------------------------------------
이건 문자열 대체하는 코드
static void replaceSpace(char a[]) {
for (int i = 0; i < a.length; i++) {
if (a[i] == ' ') {
a[i] = ',';
}
}// 공백을 발견하면 ,로 바꿔준다.
}
static void printCharArray(char a[]){
for(int i = 0; i<a.length; i++){
System.out.print(a[i]);
}
System.out.println(); //이건 그냥 출력용
}
public static void main(String[] args) {
char c[] = {'T','h','i','s',' ','i','s',' ','a',' ','p','e','n','c','i','l','.'};
printCharArray(c);
replaceSpace(c);
printCharArray(c);
}
---------------------------------------------------코딩타임이길래 복습하는 것 ------------------------------------------
[12] 메소드 오버로딩 + 생성자
예~ 생성자~~
같은 클래스 내에서 이름이 같은 메소드를 여러 개 만드는 것.
이름이 같아도 인자값으로 받는 개수나 타입이 다르면 다른 메소드로 JVM이 인식하기 때문에 가능한 일
예를 들어 println 같은 것도
System.out.println(1);
System.out.println(1.5);
System.out.println("우리는 한국인");
System.out.println(a);
이렇게 메소드 오버로딩 식으로 선언되어져 있음.
근데 return 타입은 메소드를 구분하는 조건으로 사용 x - 받는 값만 인정
이름이 다르면 메소드 오버로딩이 아님
public void prinnta(int x){}
public void prinnta(float x){}
public void prinnta(String x){}
저런 식으로 만들면 되는데
PrintStream 클래스 애들이 메소드 오버로딩의 예에 많음
http://docs.oracle.com/javase/8/docs/api/
PrintStream docs에서 보면 out이 printStream 타입 변수로 선언되어져 있다.
println()메소드 및 생성자는 대표적인 메소드 오버로딩.
-그러므로 생성자도 여러 개 만들 수 있는 것
메소드의 인자의 개수나 타입이 달라야 한다.
인자나 개수나 타입이 같고 리턴 타입만 다르면 컴파일 오류
------2교시 코딩해놓고 졸았음 - 메소드 오버로딩-----
어쨌든 이름을 같게 해놓고 파라미터를 다르게 주면 다른 메소드인것
package day07;
public class AvgTest {
public int getAvg(){
System.out.println("값을 2개이상 입력해 주세요.");
return 0;
}
public int getAvg(int a, int b){
return (a+b)/2;
}
public int getAvg(float a, float b){
return ((int)a+(int)b)/2;
}
public int getAvg(int a, int b, int c){
return (a+b+c)/3;
}
public int getAvg(int a, int b, int c , int d){
return (a+b+c+d)/4;
}
// public float getAvg(){
// return 0.0f;
// }
public static void main(String[] args) {
AvgTest st = new AvgTest();
System.out.println(st.getAvg());
System.out.println(st.getAvg(10,20));
System.out.println(st.getAvg(10.5f,20.5f));
System.out.println(st.getAvg(10,20,30));
System.out.println(st.getAvg(10,20,30,40));
}
}
이런 경우에
// public int getAvg(int a, int b){
// return (a+b)/2;
// }
요렇게 하고
System.out.println(st.getAvg(10,20));
이렇게 하면 제일 비슷한 float 2개 들어간 getAvg로 계산함
--------------------------------------
생성자
1. 리턴형이 없음
2. 클래스명과 같아야함( 대소문자 구별함)
3. new를 이용해서 객체 할당 후 초기화함 ★★
4. 생성자를 안 만들어주면 기본생성자를 자동으로 만들어줌 ★★
기본생성자: 매개변수에 아무것도 없는 것 - 그냥 ()만 있는 것
이거 한번 더 보기... - 졸았음
package day07;
class School2{
int kuk = 0;
int eng = 0;
int tot = 0;
public int hap(){
tot = kuk=eng;
return tot;
}
}
public class SchoolMain2 {
public static void main(String[] args) {
School2 sc2 = new School2();
sc2.kuk = 90;
sc2.eng = 100;
System.out.println("hap:" + sc2.hap() );
}
}
생성자를 아예 호출을 안 하면 자동으로 JVM이 만들어줌.
package day07;
class School3 {
int kuk;
int eng;
int tot;
public School3() {
}
public int hap() {
tot = kuk + eng;
return tot;
}
}
public class SchoolMain3 {
public static void main(String[] args) {
School3 sc3 = new School3();
sc3.kuk =90;
sc3.eng = 100;
System.out.println("hap:" + sc3.hap());
}
}
기본 생성자에 파라미터값이 없어도 그냥 만들어놓는 것이 낫다.
package day07;
class School4 {
int kuk;
int eng;
int tot;
public void setKuk(int kuk) {
this.kuk = kuk;
}
public void setEng(int eng) {
this.eng = eng;
}
public void setTot() {
tot = kuk + eng;
}
public int getKuk() {
return kuk;
}
public int getEng() {
return eng;
}
public int getTot() {
return tot;
}
public School4() {
}
public School4(int kuk, int eng) {
this.setKuk(kuk);
this.setEng(eng);
}
}
public class SchoolMain4 {
public static void main(String[] args) {
School4 sc4 = new School4();
sc4.setEng(90);
sc4.setKuk(100);
sc4.setTot();
System.out.println("hap: " + sc4.getTot());
School4 sc = new School4(90, 100);
sc.setTot();
System.out.println("hap2: " + sc.getTot());
}
}00
만약에public School4(int kuk, int eng) {}는 있는데 Schoo4(){}가 없으면 오류가 난다.
그러니까
1. 생성자를 아예 안 만들던가(자동으로 만들어줌)
2. 변수 넣는 생성자를 만들면 기본 생성자(클래스명(){} ) <- 를 꼭 만들어준다.
3. 사실 그냥 안써도 만들어주는게 낫다 <-
--------------------------------------
Static 변수 = 정적 변수 = 클래스 변수 , Static method = 클래스 메소드
- Static을 사용하면 객체를 만들지 않고 변수나 메소드의 사용이 가능하다.
보통 간단한 값의 처리시 주로 이용한다
new를 이용하여 메모리를 할당해서 쓰지만 static 요소들은 클래스가 JVM에 인식될 때 자동으로 메모리가 할당된다.
데이터 영역에 위치해있음.
public class StaticTest{
public static int b = 0; <- 최초 1회만 메모리 할당을 받고 모든 객체들이 공유함
private int a = 0; <-- 인스턴스 변수
}
public class Test{
.....
StaticTest s1 = new StaticTest();
StaticTest s2 = new StaticTest();
.....
}
저런 식으로 그냥 만들면 DATA 영역에 만들어진다.
package day07;
class ScjpPass{
int t1;
int t2;
int t3;
int t4;
static int BONUS = 100; //클래식 변수 정적 변수 스태틱 변수
public int getT1() {
return t1;
}
public void setT1(int t1) {
this.t1 = t1;
}
public int getT2() {
return t2;
}
public void setT2(int t2) {
this.t2 = t2;
}
public int getT3() {
return t3;
}
public void setT3(int t3) {
this.t3 = t3;
}
public int getT4() {
return t4;
}
public void setT4(int t4) {
this.t4 = t4;
}
public static int getBONUS() {
return BONUS;
}
public static void setBONUS(int bONUS) {
BONUS = bONUS;
}
public ScjpPass(){
}
public ScjpPass(int t1, int t2, int t3, int t4){
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
}
public class Scjp {
public static void main(String args []){
System.out.println("스태틱변수: " +ScjpPass.BONUS);
// ScjpPass.BONUS++;
ScjpPass.setBONUS(112);
ScjpPass sp = new ScjpPass(85,90,80,70);
System.out.println("sp.t1: " + sp.t1);
System.out.println("sp.BONUS: " + sp.BONUS);
}
}
----------------------------------
스태틱 메소드는 객체를 만들지 않고도 호출할 수 있다.
package day07;
class SCWCD{
int t1,t2,t3,t4;
static int BONUS = 100;
public int getT1() {
return t1;
}
public void setT1(int t1) {
this.t1 = t1;
}
public int getT2() {
return t2;
}
public void setT2(int t2) {
this.t2 = t2;
}
public int getT3() {
return t3;
}
public void setT3(int t3) {
this.t3 = t3;
}
public int getT4() {
return t4;
}
public void setT4(int t4) {
this.t4 = t4;
}
public static int getBONUS() {
return BONUS;
}
public static void setBONUS(int bONUS) {
BONUS = bONUS;
}
public SCWCD(){}
public SCWCD(int t1, int t2, int t3, int t4){
this.t1 = t1;
this.t2 = t2;
this.t3 = t3;
this.t4 = t4;
}
public static void prLine(){
System.out.println("***************");
System.out.println(" SOLDESK ");
System.out.println(" JAVA ");
System.out.println("***************");
}
}
public class SCWCDmain {
public static void main(String[] args) {
//클래스.static메소드명();
SCWCD.prLine();
}
}
이런 식으로 그냥 클래스명으로 호출 가능하다.
-----------------------------------------------
객체를 생성하면 멤버변수 같은 건 그냥 기본 지정된 값으로 초기화되는데
static변수는 처음에 한번 특정값으로 초기화되고 끝임.
그리고 나서 값을 변경해주면 증가나 감소가 된다.
또 객체를 여러개 생성해도 한번만 생성이 된다.
- 멤버 메소드에 static 변수를 선언할 수 없다.
package day07;
class Box {
int cnt = 0;
static long boxID = 0;
static int count = 0;
//자주 쓰는 것만 static
public Box() {
boxID = boxID + 1;
cnt = cnt + 1;
System.out.println("멤버 변수 cnt: " + cnt);
System.out.println("static 변수 BoxID: " + boxID);
}
// // 멤버 메소드에서는 static 변수를 선언할 수 없습니다.
// public void staticTest() {
// static long count = 0;
// //static이 들어가서 data영역으로 가야하는데
// //지역변수라서 stack에 가야함 -_-);;
// //근데 메인문 전에 static변수 할당이 끝나야되어서
// //static 사용 불가능
// count = count + 1;
// }
//static 메소드에 static 변수를 선언할 수 없습니다.
public static void staticTest2(){
//static이든지 말든지 메소드 안에서는
//변수 만들면 무조건 stack영역임
static int count = count+1;
System.out.println("count: " + count);
}
}
public class StaticDemo {
public static void main(String[] args) {
Box.staticTest2();
Box.staticTest2();
Box.staticTest2();
Box.staticTest2();
Box mybox1 = new Box();
// Box mybox2 = new Box();
// Box mybox3 = new Box();
mybox1.staticTest2();
}
}
어쨌든 static은 사용할 때만 사용해야 함... 메모리 낭비인것
static: 생성 없이 클래스 영역 안에 속한 static이란 메모리 영역안에 오직 하나만 생성되서,
여러 인스턴스가 동시에 공유할 수 있도록 되어있는 것
그래서 클래스당 하나고, 정적으로 먼저 생성된 것들 - data영역
가능한 static 종류는 - 정적 멤버 변수, 정적 메소드, 정적 내부 클래스
이걸로 다 만들면 setter getter 안써서 짱 편한데 안 쓰는 이유는
1. 메모리 부족
2. 그리고 *로 import하면 정적 자원이 메모리에 과다하게 들어가니까 *로 import 하지 말 것 - Integer같은거...
--------------날라가고 다시 ---------------------
package day07;
class Final {
int money = 10000;
final int day = 7;
final int week = 4;
// 객체를 만들지 않아도 사용할 수 있습니다.
// final static 변수
final static int month = 12; // 1년 // = final과 static 두개의 특징을 다 가진 것
public Final() {
}
}
public class FinalMain {
public static void main(String[] args) {
Final fi = new Final();
fi.money = 15000;
// final 변수는 값을 변경(대입)할 수 없습니다.
// fi.day = 10;
System.out.println("1주일 용돈: " + fi.money * fi.day);
System.out.println("1년: " + Final.month + "달");
// Final.month = 20000;
}
}
이거 Final.month하고 fi.month 하고 같은 애임 - 스태틱이라서
---------이게 여기까지임 ----------------------------
http://www.lectureblue.pe.kr/reqtiles/read.jsp?bbsno=13&nowPage=1&col=&word=&code=1
13회차까지
이거 메모리 어디에 위치하는 지 써보기...:>
------------------------------위에 날아간 거 다시 적기-------------12회차~13회차 다 날아감 ㅠㅅㅠ...
Access Modifier - 접근 한정자 = 제한자 = 수정자
public으로 변수를 만들면 - 아무데서나 접근 가능 (남의 클래스에서도)
private 로 변수를 만들면 - 처리 기능을 메소드로 구현해서 캡슐화 o
클래스간에 멤버 변수나 멤버 메소드에 접근하는 것을 제한함.
클래스간에 간섭을 줄이기 위해 적용함.
클래스간에 간섭을 막을 수 있음으로 콤포넌트의 독립성을 강화할 수 있다
ㄴ 만약에 각각 컴포넌트 간 연관성이 있으면 작은 부분만 필요할 때 큰 게 줄줄 딸려온다거나 해서 유지보수나 코드 수정이 용이하지 않음.
-----------------------------------------------------------------------------------------
접근 제한자 같은 클래스 같은 패키지 상속관계의 다른 패키지 관련없는 다른 패키지
(같은 폴더) (폴더 상관없음) (다른 폴더)
------------ -----------------------------------------------------------------------------
private ○ X X X (중요)
-----------------------------------------------------------------------------------------
friendly ○ ○ X X
-----------------------------------------------------------------------------------------
protected ○ ○ ○ X
------------------------------------------------------------------------------------------
public ○ ○ ○ ○ (중요)
------------------------------------------------------------------------------------------
private - 같은 클래스만 접근 가능
friendly = default = 아무것도 없는거 - 같은 클래스, 패키지까진 접근 가능
protected - 같은 클래스, 패키지, 상속관계에 있는 다른 패키지까진 접근 가능
public - 다가능...
private - 이랑
public - 을 잘 쓴대... :>
package day07;
class Data {
private String name = null;
private String season = null;
private int year = 0;
public void setName(String name) {
this.name = name;
}
public void setSeason(String season) {
this.season = season;
}
public void setYear(int year) {
if (year >= 20 && year <= 30) {
this.year = year;
} else {
System.out.println("입력될 수 있는 나이 20~30세 사이입니다.");
}
}
public String getName(){
return name;
}
public String getSeason(){
return season;
}
public int getYear(){
return year;
}
}
public class DataAccess {
public static void main(String[] args) {
Data d = new Data();
// d.name = "왕눈이";
// System.out.println(d.name);
// d.name("왕눈이"); <-이거는 private 쓰면 접근 불가
d.setName("왕눈이");
d.setSeason("늦가을");
d.setYear(35);
System.out.println(d.getName());
System.out.println(d.getSeason());
System.out.println(d.getYear());
}
}
------------------------------------------
private는 외부에서 호출될 수 없음.
package day07;
class PrivateTest {
public int kuk = 0;
public int eng = 0;
public int sum = 0;
private void sum() {
sum = kuk + eng;
if (sum > 200) {
System.out.println("점수가 200을 초과했습니다.");
sum = 0;
} else {
System.out.println("합계가 정상적으로 처리?습니다.");
}
}
// Deligate Method - 직접 접근 못하니까 대리자...
//이런 경우 별로 많지 않은 것
public void call_sum() {
sum();
}
}
public class PrivateTestMain {
public static void main(String[] args) {
PrivateTest pt = new PrivateTest();
pt.kuk = 90;
pt.eng = 95;
// pt.sum(); //외부에서 호출할 수 없습니다.
pt.call_sum();
System.out.println("pt.sum(): " + pt.sum);
}
}
------------------------------마지막시간---------------------------
Garbage Collecting
1. 멤버변수와 객체에 할당된 메모리를 회수한다.
2. JVM이 자동으로 수행한다.
3. 멤버 메소드등 일반 메소드안에서 생성된 객체가 메소드의 지역변수에서 참조 할 때 - 메소드 종료시 자동으로 메모리 회수!
null값을 가지고 있는 객체변수가 있을 때 걔가 참조했던 객체는 회수의 대상
그리고 이거 별로 순위가 안 높아서 다른 애들 다 끝나면 수행
gc()를 실행하면 강제로 메모리 회수 작업을 하게 되는데 - finalize()메소드호출
이거 근데 별로 안 쓰는 편이 좋은 거래 왜냐면 잘못하면 과부하걸림...
생성자 - 만약에 내가 안 쓰면 자동으로 호출됨
소멸자 - finalize() - 자동 호출 되지 않음 = 폴백 (fallback) 메소드 -굳이 강제로 안 해도 될거 같은 느낌
해시코드값 같은 것 머리가 아픈것
힙에서의 삶과 힙에서의 삶과 죽음 넘나 철학적인것 -_-);;
그러니까 그냥 객체 위치를 가리키는 해시코드값이 사라질 시기 같은 거임...
참조하는 애 없으면 gc가 할 일 없을때 가서 finalize()호출해서 없애줌
//가비지 컬렉터 소스 안 쳐봤음 - 쳐보기
>>>>> GarbageTest.java
class Garbage { int objNo; public Garbage(int n) { objNo = n; System.out.println("Garbage class " + objNo + " 이 만들어 졌습니다."); } //객체의 메모리가 회수 될때에 자동으로 호출됩니다. protected void finalize() throws Throwable { System.out.println("Garbage class " + objNo + " 에서 쓰이던 메모리가 수집되었습니다."); super.finalize(); } } public class GarbageTest { public static void main(String[] args) { Garbage[] ga = new Garbage[10]; //객체 생성 for (int i=0; i < ga.length; i++) { ga[i] = new Garbage(i); } //객체 메모리 해제 for (int i=0; i < ga.length; i++) { ga[i] = null;//메모리 회수의 대상이 됩니다. } //강제로 가베지컬렉션 기능 수행 System.gc(); } }
5. 수업
진도:
hw:
6. 할것
소스코드 메모리 영역 적어보기.
DecimalFormat 외울 것 - 집에 가기 전에 한번 짜 볼 것.
package day07;
import java.text.DecimalFormat;
public class TestDecimalFormat {
public static void main(String[] args) {
double testnum;
DecimalFormat d = new DecimalFormat(".###");
java.util.Scanner s = new java.util.Scanner(System.in);
System.out.println("입력하세요: ");
testnum = s.nextDouble();
System.out.println(d.format(testnum));
}
}
짰음.
Studydesk 인강 볼 것.
ocjp - 할인중 (6월까지 신청할 것)
http://itandgame.tistory.com/128
여기 덤프 있음