2010-11-29 4 views
7

저는 SML (Functional Programming Language)을 배우기 시작했고이 언어로 프로그래밍되었습니다. 그리고 나서 자바를 검사하기 시작했고 클래스 필드가 전역 변수처럼 보이고 프로그래밍을 복잡하게 만든다고 느꼈습니다. 예를 들어, 어느 것이 읽거나 쓰는지 알아보기위한 메소드를 읽어야 만합니다.클래스의 필드가 전역 변수와 비슷하지 않습니까?

C와 같은 프로그래밍 언어에서 전역 변수를 사용한다고 들었습니다. 하지만 Java 클래스 필드는 어떻습니까? 모든 클래스 메서드에 대해 전역 변수와 같지 않습니까? 필드를 사용하는 것은 나쁜 생각입니까? (또는 어쩌면 내가 뭔가 잘못 이해했거나 "잘못된 방법"Java에서 프로그램)

답변

0

하지만 Java 전체 프로그램은 단일 클래스를 사용하여 작성되지 않았습니다. 그리고 전역 변수와 같은 상수 (public static final fields)입니다. 그리고 내 충고는 당신이 자바의이 단일 부분에 집중하지 않는다는 것입니다. 자바에 대한 좋은 점은 전반적으로 무엇을 전달하는지에 있습니다. 왜냐하면 그 때 자바의 각 기능의 공평성을 볼 수 있습니다.

1

아니요, 클래스 필드는 전역 변수가 아니지만 동일한 용도로 잘못 사용될 수 있습니다.

전역 변수는 모든 범위에서 액세스 할 수 있습니다. 그들은 모든 범위에서 글을 쓰는 경향이 있습니다. 이로 인해 커다란 코드베이스를 이해하고 디버그하기가 어렵습니다. 전역 변수는 또한 nameclash를 초대합니다.

클래스 필드는 클래스 범위 내에 있습니다. 그들은 개인 액세스로 클래스에 캡슐화되어 클래스 외부에서 액세스하지 못하는 경향이 있습니다. 이는 직접적인 액세스와 수정을 코드의 작은 부분으로 제한합니다.

2

Java (또는 다른 객체 지향 언어)가 작동하는 방식을 이해하지 못한다고 말할 수 있습니다.

개체 지향 언어에서 클래스는 전체 프로그램에서 필요할 수있는 여러 가지 유형의 것을 나타냅니다. 예를 들어 이것을 사용하는 것이 좋습니다. 프로그램에서 자동차를 모델링한다고 가정 해 봅시다.

당신은 Car 클래스를 가질 것이고, 당신이 필요로하는 각각의 새 차를 표현하기 위해 Car 클래스의 새로운 객체 (새로운 인스턴스)를 생성 할 것입니다. 자동차 자체는 서로 다른 구성 요소로 구성됩니다. 바퀴, 모터, 창 등이 있습니다. 따라서 이러한 각 구성 요소에 대한 클래스가 있으며 각 자동차 객체에는 모든 다른 클래스의 객체 세트가 포함됩니다. 예 :

Car1 { 
     motor1 
     window1.1, window1.2 
     wheel1.1,wheel1.2 
} 

Car2 { 
     motor2 
     window2.1, window2.2 
     wheel2.1,wheel2.2 
} 

이 경우 각 자동차 구성 요소를 클래스 필드로 정의합니다. 이 필드는 해당 클래스의 모든 메소드에서 액세스 할 수 있다는 점에서 모든 효과 '전역'에 대한 것입니다. 누락 된 것처럼 보이는 세부 사항은이 클래스의 각 새 객체가 고유 한 필드 및 메소드 세트를 갖고 있다는 것입니다. 그들은 그것들을 공유하지 않기 때문에 각 모터, 휠 세트 등은 Car 클래스의 한 인스턴스에 속합니다. 따라서 car 클래스에서 deleteWindows()라고하는 메서드를 사용하면 모든 창을 제거하고 car2에서 해당 메서드를 호출하면 car1의 창을 삭제하지 않습니다.

또 다른 중요한 세부 정보는 여러 변수를 '접두어'로 정의 할 수 있다는 것입니다 (메소드도 있음). 첫째로 당신은 공공 및 사적 (보호 받는다, 그러나 나는 그것에 들어가지 않을 것이다)을 가지고있다. 변수를 private로 선언하면 해당 변수에 액세스하고 변경할 수있는 유일한 객체가 해당 변수를 소유하고 있다는 것입니다. 반면에 public 변수는 다른 객체에 의해 액세스되고 변경 될 수 있습니다. 그것들은 접근 가능하지만 명시 적으로 객체의 변수를 변경하고 싶다고 말하면됩니다 (objectsName.variable을 작성합니다, 우리의 경우 car1.motor에 있음).

클래스의 모든 인스턴스에서 공유하는 변수/메소드를 가질 수도 있습니다. 이렇게하려면 정적으로 선언하십시오 (클래스에 실제로 속하며 특히 클래스의 어떤 객체에도 속하지 않습니다). 개인/공용은 여전히 ​​적용되지만 개인 정적 변수는 해당 클래스의 인스턴스 (그리고 같은 클래스의 정적 메서드)에서만 액세스 할 수있는 반면 공용 변수는 다른 클래스/개체에서 액세스 할 수 있습니다. 자신이 속한 클래스 외부에서 액세스하려면 ClassName.variable/method를 사용합니다 (앞의 예제에서 Car.variable).

경우에 따라 인스턴스를 만드는 데 의미가없는 클래스가 필요할 수 있습니다. 나는 종종 전체 프로그램에서 사용하고자하는 수학 연산자가 포함 된 Math 클래스를 만들어야한다고 생각한다. Maths 객체를 만드는 것은 의미가 없기 때문에 모든 메서드를 'public static'으로 정의하고 다른 클래스에서 필요할 때마다 액세스 할 수 있습니다.

나는 의심의 여지가 있기를 바랍니다. 어쨌든 나는 당신이 객체 지향 프로그래밍에 대해 약간의 독서를 할 것을 제안 할 것이다. 아마도 객체 지향 (OO)에 중점을 둔 자바를 가르치는 책을 얻을 것이다. 이해하기 어려운 개념은 아니지만, 어렵다. 비 OO 배경에서 나온 경우 OO 언어로 올바르게 프로그래밍하는 데 익숙합니다.

BlueJ를 살펴볼 수 있습니다. 기본적으로 OO 프로그래밍을 이해하고 사용하도록하는 Java IDE입니다. 너무 오랫동안 사용하라고 제안하는 것이 아니지만 OO 기본 사항을 잘 이해할 때까지 시작하는 것이 좋습니다.

Zepee

+0

정적 필드와 비 정적 필드의 차이점을 알고 있으며 각 개체의 상태가 고유하다는 것을 알고 있습니다. 그렇지 않으면 내가 말하게한다. 기본적으로 많은 함수 인 C 코드의 2000 줄이 있다고 가정 해 보겠습니다.이 함수에서 사용할 전역 변수를이 파일에 포함시키는 것이 좋습니다. 내가 아는 바로는, 대답은 아니오입니다 (각 함수가 어떤 함수를 쓰거나 읽는지 모르기 때문입니다). 같은 클래스에서 발생합니다, 클래스는 2000 클래스의 코드를 가질 수 있습니다,이 클래스 범위에서 전역 변수와 같습니다. 맞습니까?C 코드 예제와 같은 것은 나쁜 것입니까? –

+0

OO 언어 이외의 많은 경험이 없지만, 당신이 가리키는 이슈, 공공 변수에 적용되는 것을 변경하는 것을 모르는 사실 등으로 보입니다. 변수에 직접 액세스하고 변경할 수있는 개체가 무엇인지 걱정해야합니다. 이것은 OOP, 캡슐화의 기본 원칙 중 하나입니다. 객체/클래스는 다른 모든 것들이 무엇인지 알 수 있어야하지만, 어떻게해야 하는지를 알 수 있습니다. 따라서 필드를 비공개로 만들고 getter/setter를 제공하는 일반적인 관행은 각 객체가 외부 세계에 대한 투명성을 제어 할 수있는 경우에만 해당합니다. – Zepee

+0

그러나 각 클래스 안에는 완전한 투명성이 필요합니다. 네가 어떻게 생겼는지조차 알지 못한다면 네가 존재 한다는게 얼마나 좋은거야? 즉, 클래스 변수가 없으면 객체 A와 객체 B를 어떻게 구별 할 수 있습니까? 개체에 필드에 액세스하는 메서드가 여러 개 있고 필드에 액세스하는 다른 개체 만 있으면 걱정할 필요가 없습니다. 클래스 변수는 필요하기 때문에 나쁘지 않을뿐만 아니라 객체를 정의하는 것이므로 클래스의 여러 인스턴스를 각각 고유 한 속성 집합으로 가질 수 있기 때문에 OO 언어가 처음 생성 된 이유입니다. – Zepee

3

Class 수준 변수는 클래스의 맥락에서 글로벌 변수입니다. 그것은 어떤 국가를 지키기 위해 행해지 며, 당신은 어딘가에 가지고 있어야합니다. 경우에 따라 Class 레벨 변수는 특히 불변이 아닌 경우 나쁜 관행으로 간주됩니다.

+3

이것은 코드를 유지하기 어렵게 만드는 주요 요인 중 하나입니다. 이 블로그에 대한 더 많은 블로그 게시물/에세이를 찾을 수 있었으면 좋겠습니다. 왜냐하면이 문제가 큰 문제인지 분명히 말하면 도움이 될 수 있기 때문입니다. void TakeCareOfStuff() {}와 같은 메소드 서명은 거대한 코드 냄새입니다. –

3

"클래스 변수"로 "정적 변수"를 사용한다고 가정합니다.

당신은 "모든 클래스 방법에 대해 전역 변수 같은 것이 아닌가?"라고 물어보십시오.

네, 맞습니다. 수업 내에서 모든 문제와 함께 지구본처럼 행동하십시오.

차이점은 클래스가 전체 프로그램만큼 복잡하지 않아야하며 이로 인해 발생하는 문제를 이해하고 수정하는 것이 더 쉬울 것이라는 점입니다.
적은 코드로 변수를 수정할 수 있으므로 고려해야 할 사항이 적습니다. 전역은 임의의 알 수없는 코드로 수정할 수 있습니다.

어떤 경우에는 클래스의 모든 인스턴스가 변수 (예 : 싱글 톤)를 공유하도록하는 것이 절대적으로 중요합니다. 책임감있게 사용하면됩니다.

사용하지 않겠습니까?
아니요, 사용할 수 있습니다. 그러나 '사실상'의 전역이되지 않도록 가시성을 필요한 최소값으로 제한하십시오.
가능하면 최종 작성하십시오.

+0

비 정적 변수를 의미합니다. 정적 변수는 객체가 어떤 변수를 읽거나 쓰는지 알 수 없으므로 더욱 심각합니다. 전역 변수는 일반적으로 전체 프로그램뿐만 아니라 2000 줄의 코드 파일에서도 좋지 않다고 생각했습니다. 2000 줄 이상의 코드를 가진 클래스 파일을 알고 있지 않습니까? (실제 시스템에는 분명히 "큰"클래스가있을 것입니다) –

관련 문제