5 분 소요

배열 점검하기

[문제]

배열을 이용하여 사람의 이름을 저장, 삭제, 수정, 검색하는 클래스를 작성하시오.

  • 최대 5명의 이름을 입력

    String [] names = new String[5]

  • 저장된 이름은 서로 겹치지 않는다는 가정

    [결과]
    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 1

    이름입력: 홍길동

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 1

    이름입력: 길라임

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 1
    이름입력: 김주원

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 2
    이름목록
    홍길동
    길라임
    김주원

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 3

    기존이름입력: 길라임
    변경이름입력: 차라임

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 2

    이름목록
    홍길동
    차라임
    김주원

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 4

    삭제이름입력: 홍길동

    <이름메뉴>
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 2

    이름목록
    차라임
    김주원

    이름메뉴
    1.추가 2.검색 3.수정 4.삭제 5.종료
    번호입력 ==> 5

    -- END --

    • [클래스 작성]

      1. NameMenu.java

        이름에 대한 추가, 검색, 수정, 삭제 기능 메소드를 정의

        • 멤버변수(필드): 배열객체(String names[])

        • 멤버 메소드)

          • 추가(): add/addName/append/create/insert

            • names[0]가 비었는지 확인하는 경우
              • names[0] == null ⭕
              • names[0].equals(null) ❌
          • 검색()

          • 수정()

          • 삭제()

            • names[0]가 “홍길동”인지 체크

              names[0]==delName ❌

              names[0].equals(delName)

      2. NameMenuTest.java

        • main()포함
          • 반복되는 메뉴 출력
          • 번호입력(1~5), 추가 수정 삭제에 필요한 이름 입력

[답안]

  • 내 답안

    image-20240612202506142

    image-20240612202530070

  • 선생님 답안

    NameMenu.java

    image-20240612202815513

    image-20240612202842135

    NameMenuTest.java

    image-20240612203000654

    image-20240612203025332

cmd 창에서 java class 파일 실행

자바 파일이있는 주소로 이동합니다.

image-20240612134443218

image-20240612134530325

여기서 실행되는 것은 아니고 현재 컴파일이 완료되어 class 파일을 실행 시켜야한다.

실행은 bin안에 존재합니다.

image-20240612134559171

` cd ..을 통해 이전 폴더로 이동할 수 있는데 이렇게 bin`까지 도달한다.

image-20240612134729861

bin에 com안에있는 ureca 패키지 안에있는 NameMenuTest.class를 실행시키고 싶은거니까

java com.ureca.NameMenuTest를 써줍니다. class는 생략가능하다.

자바의 특징

  • OOP(Object Oriented Programming)

    • 코드의 재 사용성이 뛰어남객체 지향언어

      새로운 코드를 작성할 때 기존의 코드를 이용해서 쉽게 작성 가능합니다.

    • 코드의 관리가 쉬워짐

      코드간의 관계를 맺어줌으로써 보다 적은 노력으로 변경이 가능

    • 신뢰성이 높은 프로그램의 개발을 기능

      제어자와 메소드를 이용해서 데이터를 보호하고, 코드의 중복을 제거하여 코드의 불일치로 인한 오류를 방지

    • 유지보수에 용이

  • Simple & Easy

    • 클래스 상속은 단일 상속만 지원

    • 포인터를 지원하지 않음

      ➡ 직접적으로 메모리 접근 ❌

  • Garbage Collector

    • Heap 메모리 영역의 객체들을 정리
      • Heap메모리는 프로그램에서 동적으로 할당된 메모리를 관리하는데 사용되는 영역
  • Datavase Independent(JDBC)

    • JDBC interface를 이용하면 DB에 독립적
  • Multi-Threading

객체 생성

하나만 만들어서 변경없이 사용할 때 : static

여러객체를 만들어 사용할 때: new

  • 메모리 할당

  • 클래스 내의 멤버(필드, 메서드)에 대한 메모리적재(실제 존재)

  • 클래스 내의 멤버와 메서드를 사용할 준비

    class A{
        int su=100;
        void hello(){
              
        }
    }
    
    A a = new A();
    

  class My(){
      
      //void hello(){
      //void hello(int coin){
      //void hello(A a){
      void hello(Parent p){
  	}
  }
  class MyTest{
      public void main(String [] args){
          
          int su=100;
          A a =  new A();
          My my = new My();
          	my.hello();
          	my.hello(1000);
          	int i=1000;
          	my.hello(i);
          	my.hello(new A());
          	my.hello)(a);
          
          my.hello(new Parent());
          my.hello(new Child());
          
          
      }
  }

객체지향의 특징

  1. 캡슐화
    • 정보은닉
    • 모듈성
  2. 상속 ⭐
    • 부모가 갖는 자원(필드, 메소드)을 아낌없이 물려주는 것
    • extends
    • 단일 상속이 기본원칙
  3. 다형성
    • 메소드 오버라이딩(MethodOverriding)⭐⭐
    • 메소드 오버로딩(MethodOverloading)

캡슐화

캡슐화란?

클래스에 필드와 메소드를 묶어주는 것

  • 특징
    • 정보은닉
    • 모듈성
class My{
    public 감기약(){
        기침_sol();
        열_sol();
        가래_sol();
    }
    private 기침_sol(){
 
    }
    private 열_sol(){
        
    }
    pritvate 가래_sol(){
        
    }
}
=====================
    My m = new My();
	m.감기약

상속⭐

  • 부모가 갖는 자원(필드, 메소드)을 자식클래스에게 물려주는 것

    • 자식클래스는 부모클래스의 멤버들을 내 것 처럼 사용 가능
  • 관련 키워드 extends

  • 단일 상속이 원칙

    API문서(Application Programming Interface)
    java.lang.Object     상위, super, 부모클래스
      ↳java.lang.String   하위,sub, 자식클래스

    ※ Object클래스

    • 최상위 클래스
    • 자바의 모든 클래스의 부모클래스
    • 사용자가 정의하는 클래스에도 자동 추가 extends Object
class Parent{
    void hello(){
        
    }
}
class Child extends Parent{
    //is a 관계
    //자식은 부모다
    //자식은 부모로 형변환이 가능
}
public static void main(String [] args){
    Child c = new Child();
    c.hello(); //실행된다. Child클래스에서 extends Parent했기 때문이다.
}
Parent p1;//생성
p1 = new Parent();//선언
Child c1 = new Child();
==============================
Parent p2;
p2 = c1;
 
Child c2;
c2=p1;
 

왼쪽에 부모가 오고 오른쪽에 자식이 오면 무조건 컴파일 된다.

반대의 경우는 되는 경우가 있고 안되는 경우가 있어서 무조건적이지 않다.

Child c = new Child();

참조는 왼쪽, 할당은 오른쪽

c는 Child를 참조하고 new는 Child()를 할당한다.

상속간의 메모리할당과 참조변수

class Parent{
    int su=300;
    void hello(){
      
    }
    void hello(String name){
        
    }//오버로딩메서드(Overloading)
    void print(){
        System.out.print("부모");
    }
}
  • 오버로딩메서드(Overloading)

    인자를 다르게 한 같은 이름의 메서드

class Child extends Parent{
    int sum=0;
    
    void print(){
        System.out.print("자식");
    }
    void goodBye(){
        System.out,print("잘가");
    }
}
  • 오버라이딩메서드(Overloading)

    부모에 있는 메서드를 재정의

부모클래스 객체생성

Parent p = new Parent();

  • Object 최상위 클래스를 기준

  • 명시된 클래스까지 메모리 할당

    Parent p = new Parent();
      
    System.out.print(p.su);
      
    p.hello();
    p.print(); //"부모"출력
    p.goodBye(); //에러 > 부모 참조변수 p를 통해 자식 메서드 호출 불가능
    

    여기서는 자식에 대한 메모리 할당이 없다.

    • 사용할 수 있는 자원

      su = 300;, hello(), print()

자식클래스 객체 생성

` Child c = new Child();`

  • Object 최상위클래스를 기준

  • 명시된 클래스까지 메모리할당

    Child c = new Child();
      
    System.out.print(c.sum);
    c.goodBye();
    c.print(); //"자식" 출력
    c.hello(); //부모메서드 호출
    
    • 부모메서드 호출

      • 자식 참조변수 c를 통해 부모메서드 호출 가능
      • 여기서는 부모에 대한 메모리 할당이 있다
    • 사용할 수 있는 자원

      Parent: su=300, hello(), print()

      Child: sum=0, goodBye(), print()

자식클래스 객체생성(부모참조)⭐

Parent p2 = new Child();

  • Object 최상위 클래스를 기준

  • 명시된 클래스까지 메모리할당

    Parent p2 = new Child();
      
    System.out.print(p2.su);
    p2.hello();
    p2.print(); //"자식" 출력
    p2.goodBye(); //에러
    
    • 에러

      부모 참조변수 p2를 통해 자식 메서드 호출 불가

    Parent를 참조한다.

    • 사용할 수 있는 자원

      Parent:su = 300, hello(), print()

      Child: sum=0, goodBye(), print()

      • p2.print()에서 자식이 출력되는 이유

      부모 참조변수 p2를 통해 오버라이딩 메서드(Child.print())를 호출

자식클래스 객체생성(부모참조)

자식클래스 참조를 하고 싶을때

Parent p2 = new Child();

  • Object 최상위 클래스를 기준

  • 명시된 클래스까지 메모리 할당

    Parent p2 = new Child();
      
    Child c3 = (Child)p2;
    System.out.print(c3.sum);
    c3.goodBye();
    c3.print(); //"자식"출력
    
    • c3.print()에서 자식이 출력되는 이유

      자식클래스로 형변환 했을때 자식메모리 사용가능(앞의 c참조변수 사용과 같다)

다형성

  • 메소드 오버라이딩(MethodOverriding)⭐⭐

    메소드를 재정의하는 것을 의미

    • 상속에서 나온 개념
    • 부모가 갖는 메소드를 자식클래스에서 재정의
  • 메소드 오버로딩(MethodOverloading)

    • 한 클래스내에 동일한 메소드를 여러개 구현

      단, 인자의 갯수가 다르거나 자료형이 달라야 한다.

      class Abc{
        int su;
        My  my;
          
        Abc( ){//기본생성자(매개변수 비어있는 생성자)---> 초기화(값할당) 메소드     
           //멤버필드에 대한 초기화 작업
           su = 10;
           my = new My();
          
           //(일반메소드 호출 전 1번 실행하는)선행작업
          
        }//생성자
          
        Abc(String name){//오버로딩 생성자
            
        }
          
        ABc(int age){
          //--->컴파일 에러발생: 클래스명과 일치하지 않으므로 일반메소드!!
          //---> 리턴자료형을 명시하지 않았음!!
        }
            
        void hello(){  
        }
      }//class Abc
      

상속을 활용한 다형성⭐

상속이란 클래스가 가지고 있는 멤버를 다른 클래스에 계승시키는 것

부모 클래스에 정의된 멤버 변수와 멤버 함수를 자식 클래스에서 재사용하여 중복을 줄인다.

  1. Parent p1 = new Parent();
  2. Parent p2 = new Child();
  3. Child c1 = new Child();
  4. Child c2 = new Parent();
  1. Parent p1 = new Parent();

    Parent 클래스의 멤버변수와 멤버함수에 접근가능

  2. Parent p2 = new Child();

    1. child 클래스의 인스턴스를 생성
    2. 이 인스턴스를 Parent 타입의 변수 p2에 할당

    이 경우 업캐스팅Up-casting이 발생.

    • 업캐스팅Up-casting

      객체지향 프로그래밍에서 서브 클래스의 인스턴스를 슈퍼 클래스의 타입으로 변환하는 것

      image-20240612191006446

      위 사진을 보면, Vector<>나 ArrayList<>가 main()에서 List<>로 변환하는 것을 볼 수 있다.

    image-20240612190338661

    출처: [순간을 소중히]https://velog.io/@shines/using-polymorphism-through-inheritance-and-implementation

    JVM의 메모리 구조를 살펴보겠습니다.

    자식 클래스 설계도에 따라 생성된 실제 객체는 힙heap영역 부모 클래스 설계도에 따라 생성된 변수는 스택stack영역

    ∴ 부모 클래스형 변수는 자식 클래스에만 있는 멤버변수나 멤버함수를 알 수 없다.

  3. Child c1 = new Child();

    1번과 마찬가지로 Child 클래스의 멤버변수와 멤버함수에 접근가능

  4. Child c2 = new Parent();

    컴파일 에러 발생

기본 자료형 Wrapper클래스(기능확장)
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean

업데이트:

댓글남기기