본문 바로가기
자바과정/스터디

스터디 3일차(this, 클래스, 실습추가)

by Parkej 2021. 2. 3.
--------------------------this 보완

-- 내 코드

 ------ this에 대한 실습코드
public class ThisCall {
	//field
	private int i,j;

	//constructor
	//오버로딩
	public ThisCall() {

	}
	public ThisCall(int i) {
		this.i = i;
	}
	public ThisCall(int i, int j) {
		this.i = i;
		this.j = j;
	}
	
	//method
	public int getA()
	{
		return i;
	}
	public int getB()
	{
		return j;
	}


	public static void main(String[] args) {

		ThisCall tc1 = new ThisCall();
		ThisCall tc2 = new ThisCall(1);
		ThisCall tc3 = new ThisCall(2, 5);

		System.out.println(tc1.getA() + "\t" + tc1.getB());// 0,0
		System.out.println(tc2.getA() + "\t" + tc2.getB());// 1,0
		System.out.println(tc3.getA() + "\t" + tc3.getB());// 2,5
	}

}
 

-- 강사님 코드

public class ThisCall {
	private int a;
	private int b;

	// ab를 초기화하는게 공통
	public ThisCall() {
//		a=b=0;
		this(0,0); // 생성자에서 생성자 호출
	} 
	public ThisCall(int a) {
//		this.a = a;
//		b=0;
		this(a,0); // 관리가 쉬워짐, 유지보수
	}
	public ThisCall(int a, int b) {
		this.a = a;
		this.b = b;
	}

	public int getA() {
		return a;
	}
	public int getB() {
		return b;
	}

	public void setA(int a) {
		this.a = a;
	}
	public void setB(int b) {
		this.b = b;
	}

	public static void main(String[] args) {

		ThisCall tc1 = new ThisCall();
		ThisCall tc2 = new ThisCall(1);
		ThisCall tc3 = new ThisCall(2, 5);

		System.out.println(tc1.getA() + "\t" + tc1.getB());// 0,0
		System.out.println(tc2.getA() + "\t" + tc2.getB());// 1,0
		System.out.println(tc3.getA() + "\t" + tc3.getB());// 2,5
	}

}
 

 

--- 정리

public class ThisExam01 {
	
	private int a;
	
	// setter
	public void setA(int a) { // (ThisExam this, int aa)
		this.a = a; // 필드 a인지 명확하게 구분지으려고 this를 썼음.
		// this를 쓰지 않으면 우선순위가 매개변수임.
	}
	// getter
	public int getA() { // getA(ThisExam this)
		return this.a;
	}
	
	public ThisExam01 getObject() {
		return this; // 자기자신의 객체를 리턴할때
	}
	public static void main(String[] args) {
		
		ThisExam01 te = new ThisExam01(); // 생성자 호출
		
		te.setA(10); // te.setA(te, 10)
		
		System.out.println(te.getA());

	}

}


/*
 * this, this()
 *  - 인스턴스 메소드에 첫번째 매개변수
 *  - 자기 자신을 접근하는 레퍼런스 
 *  
 * this
 * : instance method의 첫번째 매개변수로 항상 존재
 * : 만들수는 없고 사용만 가능
 * 
 * this
 * 1. 매개변수 이름과 필드 이름이 같을 경우
 * 2. 인스턴스 메소드에서 자기자신의 객체를 리턴할떄
 * 
 * this() 자기 자신을 호출
 * : 생성자 호출됨.
 * : 생성자에서 또다른 생성자를 호출(내 자신의 생성자)
 * : 이유 : 유지보수 관리가 쉬워짐
 */
 

-- 스태틱에서 인스턴스 강제접근

// 스태틱에서 인스턴스 변수에 접근하는 방법.
public class ThisExam02 {
	private  int a;

	// 스태틱에서 굳이 인스턴스를 쓰고 싶으면 this 역할을 직접 구현해야함.
	public static void disp(ThisExam02 te) {
		System.out.println(te.a);
		// 스태틱 필드에서 인스턴스 접근 불가
	}
	public static void main(String[] args) {
		
		ThisExam02 te = new ThisExam02();//메모리를 만들었는데에도 못쓴다...왜? this로 객체를 구분해서 해야하는데 없기때문
		te.disp(te);
		//ThisExam02.disp();
	}

}
 

-------------------------- 클래스 관계 (5일차 진도)

 

class A{ // data class
	String n;
	public String getN() {
		return n;
	}
	public void setN(String n) {
		this.n = n;
	}
}
class B{ // data class
	int n;
	public int getN() {
		return n;
	}
	public void setN(int n) {
		this.n = n;
	}
}

public class CallCon {
	// has ~ A 관계
	private A name; // A타입을 가져다 쓰면서 이름 
	private B age; // B타입을 가져다 쓰면서 나이
	
	public CallCon() {
		// 생성자에 객체를 생성과 동시에 필드의 클래스 변수를 초기화 해줘야함.
		name = new A();
		age = new B();
		// 실제 객체를 누가 쓰느냐
	}
	
	
	public void setName(String n) {
		this.name.setN(n);
	}
	public String getName() {
		return this.name.getN();
	}

	public void setAge(int n) {
		this.age.setN(n);
	}
	public int getAge() {
		return this.age.getN();
	}


	public static void main(String[] args) {
		// 사용자
		CallCon cc = new CallCon();

		cc.setName("super");
		cc.setAge(1000);

		System.out.println(cc.getName());
		System.out.println(cc.getAge());
	}

}

/* 5일차
 * 
 * 클래스관계 
 * has ~ a ( ~가 ~를 가지고 있다.) // 리모콘
 *  : 객체가 필요에 의해서 객체를 가져다 쓰는 괸계
 *  
 *  독립된 객체 : 데이터 클래스
 *   - 자기 자신만을 만듦 누군가 가쓴다면 쓸 수 있는 환경을 만들기 (main과 같음)
 *  데이터클래스를 갖다 쓰는 클래스 : 데이터관리클래스
 *  
 * is ~ a  ( ~는 ~이다.)
 * 
 * 
 */

 

 

 

---------------------- 실습 : 한사람 성적처리(과목수 입력) 

 

 

// 이름 입력받는 데이터 클래스

package Day5;

public class NameStudent {
    private String name;
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getName() {
        return name;
    }

}



// 과목 입력받는 데이터 클래스

package Day5;

public class Subject {

	private int []score; // 입력받을 과목 필드 선언
	private float avg;
	private int tot;

	//   private int tot;
	//   private float avg;

	// 과목은 사용자가 가져다 쓸거임

	public Subject() {
		
	}

	// 과목 수 선언
	public Subject(int a) {
		this.tot = 0;
		this.score = new int[a];
	}


	// 과목 연산
	public void setScore(int i, int score) {
		this.score[i] = score;
	}
	public int[] getScore() {
        return this.score;
    }
	

	// 총점 (마지막 배열)
//	public void seTotal(int score) { 
//		// 출력할때 getScore에서 마지막 인덱스를 쓰기 위함임.
//		this.score[getScore().length-1] += score;
//	}
	
	public int getTotal() { //총점
		
		for(int i=0;i<score.length;i++) {
			tot += score[i];
		}
		return tot;
	}

	// 총점
	//   public int getTotal() {
	//      return kor+eng+mat;
	//   }

	// 평균
	public float getAvg() {
		return (float)tot/getScore().length;
	}
}



// 메인부분

package Day5;

import java.util.Scanner;

public class StudentScoreMag {
	// 연산 담당 

	private NameStudent name; // name 타입을 쓴다. 대기상태
	private Subject sub;

	// 생성자 초기화 및 객체 생성
	// 오버로딩
	public StudentScoreMag() {
		name = new NameStudent(); // 객체 생성.. name안의 get, set사용
	}
	public StudentScoreMag(int a) {
		sub = new Subject(a);
	}

	// Method
	public void setName(String n) {
		this.name.setName(n);
	}
	public String getName() {
		return this.name.getName();
	}

	// main
	public static void main(String[] args) {
		char str;
		Scanner sc = new Scanner(System.in);
		StudentScoreMag ssm = new StudentScoreMag();


		do {
			// 이름
			System.out.print("학생 이름 : ");
			ssm.setName(sc.next());

			// 과목 수 입력
			System.out.print("과목 수 입력 : ");
			StudentScoreMag ssm1 = new StudentScoreMag(sc.nextInt());

			for(int i=0;i<ssm1.sub.getScore().length;i++) {
				System.out.printf("%d번 과목점수 입력 : ",i+1);
				ssm1.sub.setScore(i, sc.nextInt());

			}

			// 출력
			System.out.println("이름 : " + ssm.getName());
			for(int i=0;i<ssm1.sub.getScore().length;i++) {
				System.out.println((i+1)+"번 과목 점수 : " +ssm1.sub.getScore()[i]);
			}
			System.out.println("총점수 : "+ssm1.sub.getTotal());
			System.out.println("평균 : "+ssm1.sub.getAvg());



			System.out.println();
			System.out.print("Continue?(y/n) : ");        
			str = sc.next().charAt(0);
			if(str == 'n' || str == 'N') {
				System.out.println("End");
				break;
			}
		}while(str == 'y' || str == 'Y');

	}

}
반응형

'자바과정 > 스터디' 카테고리의 다른 글

파이썬 기초 다지기  (2) 2021.02.27
Java 기초 - 6일차  (0) 2021.02.04
스터디 2일차(실습 코드 보완)  (0) 2021.02.02
스터디 2일차  (0) 2021.02.02
스터디 1일차  (0) 2021.02.02

댓글