본문 바로가기
학원수업/12월

12/15 자바 14회차(this 최종, 배열복사, Vector)

by 코딩마스터^^ 2022. 12. 15.

4주차 학습 예정

class

객체

추상클래스

인터페이스

상속

 

3주차

4주차를 위한 준비

 

1. 인스턴스화

선언부와 생성부의 이름이 다를 수 있다.--->다형성

Car myCar = new Sonata();

Heap영역에 상주한다.

인스턴스화는 생성자 호출을 포함한다. 생성자에는 파라미터가 있다.

파라미터는 사용자가 입력한 값이다.

파라미터는 객체와 객체사이의 메세지를 받는 것이다.

메세지 즉, 파라미터를 통해서 협업이일어난다.

 

 

타입이 없고 파라미터가 없는 클래스 이름과 같은 생성자는 디폴트 생성자이다.

디폴트 생성자는 생략이 가능하다.

파라미터를 갖는 생성자는 생략할 수 없다.

생성자가 한개라도 생성되어 있으면 디폴트 생성자를 생략할 수 없다.

전변의 초기화

전역변수는 고유명사가 그 후보이어야 한다. 객체의 특성 때문에

 

B가 파라미터를 넣어준다. B가 A가 설계한 클래스를 가져다 사용한다.

 

파라미터의 갯수가 다르거나 파라미터의 타입이 다른경우 메소드 오버로딩 가능

전역변수의 초기화를 생성자가 담당한다.

파라미터에 넣는 값들이 결국 전역변수에 대한 초기화이다.

 

2. this

mian 메소드는 

 

자식클래스가 부모클래스를 갖기위해 초기화가 필요하다.

package dev_java.ch03.PracticeThis;

class A{
  int i=1;
  AMain aMain = null;

  public A(){
  }

  public A(AMain aMain){
    System.out.println("A(AMain aMain)호출 성공");
    this.aMain=aMain; //초기화 해서 null인곳에 값을 넣어줌. this를 안넣어 주면 구분이 안된다
    System.out.println("받아온주소번지"+aMain);
  }
  void methodB(){
  aMain.methodA();
  }
}


public class AMain {
  A a = new A(this);//this 있고 없고 차이난다! 
  
  void methodA(){
  System.out.println("AMain methodA()호출");
  }
  public static void main(String[] args) {
  AMain aMain=new AMain();
  aMain.a.methodB();  
  }
  
}

public A() 디폴트 생성자를 넣는것이 좋다. 개발자들끼리의 약속이다.

public A(Amain aMain)을 만들때에는 자동생성 안되니까.

 

this 이해 완료^^

 

public class DeptTable1 extends JFrame{//DeptTable is a JFrame

  //선언부
  String header[]={"부서번호","부서명","지역"};
  String data[][]=new String[1][3];
  //this는 사용되는 클래스 영역에서 선언된 클래스를 가리킨다.
  //그러면 여기서는 DeptTable1타입인 것임
  // DeptTableModel은 자바에서 제공되는 클래스임-생성자도 정해져 있음
  //제공되는 생성자에 없음 - 결국 사용못함-컴파일 에러(문법에러발생)
  //생성자는 메소드 오버로딩 규칙을 따름

  
  DefaultTableModel dtm = new DefaultTableModel(data,header));//생성자 호출 
  //생성자
  public DeptTable1(){
    initDisplay();
  }

this를 (data, header) 이자리에 못쓰는 이유는?

원래 정해진 생성자가 있다.

 

클래스가 다르더라도 생성자를 호출 할 수 있다.

배열복사

얕은 복사

복사된 배열이나 원본 배열이 서로간에 같이 변경이 된다. 

 

깊은 복사

실제로 배열이 두개 만들어 지는것이다. 각자 바뀐다. 

메모리 효율 측면에서 본다면 비 효율적이다.

 

깊은 복사(Deep Copy)는 '실제 값'을 새로운 메모리 공간에 복사하는 것을 의미하며,

얕은 복사(Shallow Copy)는 '주소 값'을 복사한다는 의미입니다.

 

다형성

선언부와 생성부가 다를 수 있다.

Duck myDuck =new WoodDuck();
Duck herDuck =new RubberDuck();
Duck himDuck=new MallardDuck();

선언부가 아니라 생성부의 이름으로 객체가 만들어 진다.= new 뒤에는 클래스 이름

그 사물이 어떤 객체가 오느냐에 따라 특징이 달라진다.

추상 클래스도 구현체 클래스가 필요하다.

 

Vector란?

Vector란 Collection 프레임워크의 일부이며 java.util 패키지에 소속되어 있습니다

ArrayList와 동일한 구조를 가지며 배열의 크기가 늘어나고, 줄어듬에 따라서 자동으로 크기가 조절이 됩니다.

Vector의 특이한 점이라면 항상 동기화되어있고 Collection 프레임워크에 없는 메서드들을 사용이 가능합니다

하지만 동기화라는 특징이 있어 스레드가 아닌 환경에서는 거의 사용이 되지 않습니다

그리고 항상 동기화되므로 스레드 환경에서의 안정성은 높지만 ArrayList와 비교하여 추가, 검색, 삭제의 성능은 떨어지는 단점이 있습니다

Class, Integer, String, Character 등의 다양한 타입으로 선언이 가능합니다

https://crazykim2.tistory.com/570

 

[JAVA] Vector의 개념 및 사용법

안녕하세요 이번 포스팅에서는 Vector에 대해서 알아보겠습니다 목차 Vector란? Vector 선언하기 Vector 값 추가하기 Vector 값 변경하기 Vector 값 제거하기 Vector 크기 구하기 Vector 값 출력하기 Vector란? Vec

crazykim2.tistory.com

벡터를 쓰면 그안에 컬럼을 다르게 담을 수 있다.

배열처럼 0번부터 인덱스로 들어간다.

배열과 유사하다.

3차배열 복잡해서 잘 안쓴다.

 

연습문제1

package dev_java.Homework.quiz1215;
/*
 * 연습문제1

*키보드로 부터 5개의 정수를 입력 받아서 배열에 저장하세요.*

*그리고 이들의 합계와 평균을 출력하는 프로그램을 작성하시오.*
 */

import java.util.Arrays;
import java.util.Scanner;

public class Practice1_dap {
  int users[]=new int[5];

  void average(int hap){//파라미터는 메세지를 전달하는 자리이다.
    double avg=0;
    avg=hap/(double)users.length;//강제 형전환
    System.out.println("평균은 :"+avg);
  }

  int total(){
    int hap=0;//지역변수는 무조건 초기화 해줘야된다. 자동으로 되지 않는다 이 안에서만 유지가 된다.
    for(int i=0; i<users.length;i++){
      hap+=users[i];
    }
    return hap;
  }
  
  void initUsers(){
  Scanner s = new Scanner(System.in);

  for(int i=0;i<users.length;i++){
    System.out.print("정수를 입력하세요");
    users[i]=s.nextInt();
    System.out.println(users[i]);
  }
  s.close();
}
  
    public static void main(String[] args) {
    
    
    Practice1_dap p = new Practice1_dap();
    p.initUsers();
    int hap=p.total();
    System.out.println("총점은"+hap+"입니다.");
    p.average(hap);

  }
}

댓글