[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)


목차

1. 객체 생성

2. 객체 생성시 메모리 구조(heap 영역)

3. 생성자

4. 접근제어자


*이 게시글에서는 속성=필드=객체변수=인스턴스 변수=멤버변수라고 불리는 것을 객체 변수라고 통일하겠다.

 

1. 객체 생성

앞선 2탄에서 클래스, 객체, 메서드, 메모리 구조에 대해 살펴 보았다. 

클래스는 책을 예를 들어 책이라는 자료형을 만들기 위해 구성요소(제목, 가격, 출판사, 저자등)를 하나로 합쳐놓은 것이다. 

책이라는 객체의 구성요소를 사용하기 위해 책이라는 자료형을 클래스로 만들었다면 그 구성요소를 이용해서 다양한 책(객체)을 만들어야 하지 않겠는가

자바에서는 Book science = new Book(); 이런 형태로 객체를 만들 수 있다.

이렇게 클래스를 이용해서 만든 객체 여기서는 science를 인스턴스라고 한다.

 

클래스는 붕어빵 틀, 객체는 붕어빵1,2 ... 이라고 생각하면 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
    }
}

science앞에 붙은 Book은 int, String처럼 Book이라는 자료형이라는 표시이므로

Book자료형 science를 선언한다는 의미이다.

Book science는 int a와 동일한 형태이다

뒤에 붙은 new Book()에서 new는 새로만들어진다는 예약어이고 뒤에 나오는 Book()은 생성자(Constructor)라고 불리는 녀석이다. 

Book science = new Book()은 즉 science라는 책 객체를 만든다는 의미인 것이다.

생성자얘기는 나중에 하고 우선 객체를 생성할 때 메모리에 어떻게 동작되는지 알아보자.


2. 객체 생성시 메모리 구조(heap영역)

살짝 복습하면 static이라고 붙은 메서드를 로딩하는데 거기서 제일 먼저 로딩되는 것이 main메서드이다. 위의 코드를 예를 들어 Test class의 main메서드가 제일 먼저 메모리에 로드돼서 호출된다.

호출되면 stack 영역에 들어가는데 이 메인메서드 안에는 Book science라는 변수가 선언돼있다. 

이때 science라는 변수를 참조변수라고 한다.(참조변수이긴 하지만 동시에 지역변수이기도 하다)

참조변수는 주소값을 저장한다.

C언어의 포인터 생각하면 된다.

출처 : [Java] 참조 타입과 참조 변수 :: 불곰 (tistory.com)

 

 

Book science를 선언하고 new 예약어와 함께 Book()이라는 생성자를 호출하면 Heap영역이라는 메모리 공간에 science라는 객체가 하나 생성된다. 

science라는 참조변수는 Heap 영역에 있는 science객체의 주소를 가리킨다.

 

science 객체 안에는 이런식으로 객체가 만들어져있고 science라는 참조변수는 Book객체(science)의 주소를 가리킨다.

여기서 getTitle()이라는 메서드는 실제 위치는 method 영역에 들어있지만 getName() 메서드의 주소로 메서드 영역의 getTitle()과 연결돼있다.

최종적으로 정리하면 Book science = new Book()이라고 하면 heap영역에 science객체(인스턴스)가 생성되고 science라는 참조변수는 heap영역의 science 객체(인스턴스)의 주소를 가리킨다

 

이렇게 객체를 생성하고 나면 그 객체의 이름인 참조변수를 이용해 객체 변수와 메서드를 사용할 수 있다

 

위의 예문 처럼 science.title 이렇게 도트 연산자를 이용해  각 객체의 객체변수와 메서드에 접근할 수 있게 된다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
        science.title="개미와배짱이";
        System.out.println(science.title);  //개미와배짱이 출력
        System.out.println(science.getTitle()); //개미와배짱이 출력
    }
}

 

앞에서 봤던 아래 예문도 객체를 이용하면 hello메서드를 static 예약어 없이 호출가능하다

 

*static 포함한 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		System.out.println(hello(a));
		System.out.println(a);
	

	}
	public static int hello(int a) {
		a=7;
		return a;
	}
}

 

*static을 사용하지 않은 경우

package test;

public class Test {

	public static void main(String[] args) {
		int a=3;
		Test test1 = new Test();
		System.out.println(test1.hello(a));
		System.out.println(a);
	

	}
	public int hello(int a) {
		a=7;
		return a;
	}
}

3. 생성자(Constructor)

Book science = new Book();에서

new 예약어 뒤에 붙은 Book()을 생성자라고 한다

 

생성자가 하는 일은 객체(인스턴스)를 heap영역에 생성하고 클래스 안에 Book() 생성자의 {}중괄호를 호출하는 역할을 하는데 객체가 생성될 때 객체 변수 값들을 초기화하는 역할도 한다

즉, science의 title과 english의 title은 다르게 설정된다는 것이다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

 

생성자는 객체를 생성할 때만 호출되는데 생성자 이름은 클래스 이름과 같고 반환값이 없다

생성자가 없는 클래스는 클래스 파일을 컴파일할 때 자바 컴파일러에서 자동으로 생성자를 만들어주는데 이렇게 자동으로 생성되는 생성자를 기본 생성자(default constructor)이라고 한다

 

개발자가 매개변수가 있는 생성자를 따로 만들면 자동으로 기본 생성자가 생성이 되지 않아 기본생성자를 만들어줘야 한다

아래에 public Book(String title){}이 바로 매개변수가 있는 생성자이다

 

이렇게 클래스에 생성자가 두 개 이상 제공되는 경우를 생성자 오버로딩이라고 한다

 

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있는데 이를 오버로딩이라고 한다

 

아래에 나오는 this라는 예약어는 객체 자신을 가리키는 예약어인데 우선 이런게 있다고 알고 넘어가자.

 

아무튼 자바의 한 클래스내에 생성자가 두 개 이상이 있으면 인스턴스를 생성할 때 원하는 생성자를 골라서 만들 수 있다

package test;

class Book {
  public String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  
  public Book() {} //기본 생성자
  public Book(String title) {
  this.title=title;
  } 

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        Book english = new Book();
        
    }
}

4. 접근제어자(access modifier)

자바에서는 예약어를 사용해서 클래스 내부의 변수, 메서드, 생성자에 대한 접근 권한을 지정할 수 있다.

이런 예약어를 접근 제어자라고 한다

접근제어자에는 private, protected, default, public 이렇게 4종류가 있다

 

다른 건 그냥 넘어가고 private만 살펴보자

출처  : 19편. 제어자(Modifiers) (hexabrain.net)

 

 

위 코드의 객체 변수 String title에 접근 제어자를 private으로 바꾸면 동일한 클래스를 제외하고는 이 변수에 직접적으로 접근할 수 없다

그래서 이를 접근하기 위해서는 메서드를 만들면 된다.

 

직접적으로 접근을 할 수 없으니 Book 제목을 받아오거나 지정할 수 있도록 메서드를 사용한다. 

package test;

class Book {
  private String title;
  public int price;
  public String company;
  public String author;
  
  public String getTitle(){
  return title;
  }
  public void getTitle(String title){
	  this.title= title;
	  }
}

public class Test {
    public static void main(String[] args) {
        Book science = new Book();
        //science.title="바보"; //오류발생 //접근 불가
        science.getTitle("안녕");
        System.out.println(science.getTitle());
    }
}

 

정보처리기사 실기에서는 어차피 거의 대부분이 동일한 클래스로 나오므로 사실 잘 몰라도 상관없다

위의 코드는 getTitle이라는 메서드가 오버로딩돼있는 것인데

getTitle을 호출할 때 매개변수가 없으면 public String getTitle()을 호출하는 것이고

매개변수가 있으면 public String getTitle(String title)을 호출하는 것이다

 


[정보처리기사/예상문제] - 2023 정보처리기사 실기 예상 문제 모음

JAVA 기출문제 모음

비전공자용 Java 요약 1탄

비전공자용 JAVA 요약 2탄(객체지향, 클래스)

비전공자용 JAVA 요약 3탄(객체 생성, 생성자, 접근제어자)

비전공자용 JAVA 요약 4탄(this, 배열, 상속, super)

+ Recent posts