다른 프로그래밍 언어에서 OOP를 배우는 데 차이가 있습니까? [닫은]

OOP를 배우고 싶습니다. 나는 파이썬을 알고 OOP에 대해 거의 알지 못한다.

하지만 포럼에서 “learn OOP”를 검색 할 때 “Python은 너무나 새롭기 때문에 Python에서 OOP를 배울 수없는 이유입니다. Java를 배우고 Java에서 OOP를 이해해야합니다”

사실인가요? 다른 프로그래밍 언어에서 OOP를 이해하는 데 차이가 있습니까? Java, C #, C ++, Perl 또는 Python에서 배우는 것처럼?



답변

이론적 인 구조 인 객체는 매우 간단합니다. 데이터, 함수 또는 둘 다를 저장하는 구조입니다. 이러한 구조는 파이썬 외부의 대부분의 언어에서 암시적인 “자기”감각을 가지고 있다는 아이디어입니다. 이를 “설명자”라고하며 데이터 (변수 또는 필드)와 함수 (일반적으로 메서드라고 함)를 해당 특정 개체에 바인딩하는 자체 참조 지점을 개체에 제공합니다. 아이디어는 더 크고 일반적인 구성이 아닌 특정 인스턴스 (일반적으로 아래에 할당 된 메모리 블록)에 속하는 변수 또는 메소드를 사용한다는 것입니다.

객체 시스템은 상속과 액세스라는 두 가지 큰 범주와 관련하여 다양합니다.

Java 또는 C ++와 같은 일부는 할당 된 오브젝트의 “청사진”역할을하는 클래스를 선언하도록합니다. 이러한 클래스와 해당 객체는 인스턴스화 한 후에는 구조적으로 수정할 수 없습니다. 변수는 변경 될 수 있지만 구조는 정적이라는 의미에서 내용을 재정의 할 수 있습니다. 예를 들어 Java의 HashMap에 새 메소드를 추가 할 수 없습니다. 인터페이스를 확장하거나 (기본적으로 계약으로 사용되는 부분적으로 구현 된 클래스) 해당 클래스의 모든 원래 변수 및 메소드와 함께 필요한 추가 메소드 또는 변수를 가져 오기 위해 서브 클래스를 만들 수 있습니다.

가장 일반적으로 인용되는 Ruby 인 다른 클래스 기반 언어를 사용하면 기존 클래스를 쉽게 열고 원하는대로 메소드를 추가 할 수 있습니다. 이것은 논쟁의 뼈이며 많은 사람들이 매우 위험하다고 생각합니다.

자바 스크립트는 더 느슨합니다. 객체는 변수 나 함수를위한 슬롯 모음에 지나지 않습니다. 프로그래머가 필요하다고 느낄 때마다 변경하거나 덮어 쓸 수 있습니다. 그것들은 다른 물체에 대한 “프로토 타입”으로 임의로 복제되어 모든 능력을 전달할 수 있습니다.

액세스 제어는 다양한 언어 간의 또 다른 큰 차이점입니다.

Java와 같은 일부 언어는 “private”및 “protected”와 같은 액세스 수정자를 매우 엄격하게 적용하여 지정된 변수 또는 메소드를 사용할 수있는 클래스 및 서브 클래스를 정확하게 정의합니다.

파이썬과 같은 다른 메소드는 메소드 또는 변수 이름 앞에 밑줄을 사용하여 그것이 개인임을 표시하는 형식이 덜 공식적입니다.

궁극적으로 파이썬은 객체 지향 방식으로 프로그래밍하기에 완벽하게 합법적 인 언어이며, 다른 언어만큼 엄격하게 강요하지는 않습니다.


답변

OOP 원칙을 배우는 것은 언어마다 다르지 않으므로 “OPP를 배우십시오”라는 용어가 “용어의 의미, OOP의 정의 및 사용 이유”를 의미하는 경우 언어는 중요하지 않습니다.

“OOP를 사용하여 개발하는 방법을 배우십시오”라는 의미라면 다른 언어에서는 다르게 처리하지만 모두 동일한 원칙을 공유합니다. 당신이 나와 같은 것이면 그냥하는 것만으로도 가장 잘 배울 것입니다. 객체 지향 측면을 다루는 훌륭한 자습서 또는 책이 포함 된 객체 지향 언어를 선택하십시오. 객체 지향 디자인의 원칙을 가지고 있다면 다른 OO 언어로 사용할 수 있습니다.

“Python은 매우 새롭기 때문에 Pyton에서 OOP를 배울 수 없습니다. Java를 배우고 Java에서 OOP를 이해합니다”

이것은 단지 내 머리를 아프게합니다. 너무 많은 잘못이 한 문장으로 밀려났습니다.

파이썬은 1989 년으로 거슬러 올라갑니다.

http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html

1995 년 자바.

http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html

그 조언의 타당성에 대한 자신의 결론을 그릴 수 있습니다 …


답변

나는 당신이 인용하는 사람이 단순히 언어 쇼비니즘을 보여주는 것이라고 생각합니다.

실제로 OOP의 개념 과 OOP의 구현 에는 차이가 있습니다. OOP 개념 중 일부를 잘 이해하면 이해하기 쉽습니다.

많은 프로그래머들이 몇 가지 유사한 언어에 익숙해 져서 능력을 확장하거나 한동안 능력을 발휘하지 않아도됩니다.

그렇다면 실제로 파이썬 은 OOP 의 개념 을 가르쳐 줄 까요?

나는 당신이 자기 주도 학습에서 일반적으로 탐구하지 않는 것들을 시도하도록하는 적절한 학습 지원이 있다면 가능하다고 말할 것입니다. 어떤 책이나 멘토가 가장 좋습니다. 마크 루츠 (Mark Lutz)는 파이썬에 대해 매우 심층적이고 상세하며 매우 훌륭한 책을 씁니다. 더 많은 것을 배우고 배우도록 강요 할 것이기 때문에 그의 책을 추천합니다.

기억해야 할 것은 파이썬의 길은 유일한 길이 아니며 유일한 올바른 길도 아니라는 것입니다. 프로그래밍 패러다임이 많을수록 프로그래머가 더 좋아집니다. Python이 OOP를 수행하는 방식은 C ++ 또는 Java가 수행하는 방식이 아니라 개념이 잘 전달됩니다.


답변

예, OOP 구현은 매우 다릅니다. 이론과 원리는 동일하지만 많은 사람들이 Java와 C ++가하는 “실제 OOP”만을 고려하여 “언어에 구애받지 않는”것으로 여겨지지만 실제로는 클래스 기반의 정적으로 유형화 된 언어를 가정합니다. .

그렇다고해서 그러한 참조가 나쁘거나 제한적이라는 것은 아닙니다. 예를 들어, “gang of four”(GoF) 저널 인 “디자인 패턴 : 재사용 가능한 객체 지향 소프트웨어의 요소”는 “정적 클래스 기반 OOP”를 의미 할 때 “OOP”라고하는 훌륭한 작품의 대표적인 예입니다.

내 의견으로는 : 그렇습니다. Python, Javascript, C 및 기타 여러 언어에서 많은 OOP를 배울 수 있습니다. 그러나 “OOP 경험”을 요구할 때 일부 사람들 (미래의 고용 주일 수도 있음)은 Java / C ++ / C #을 의미합니다. 따라서 다른 견해도 확인하는 것이 좋습니다.

(그리고 이것들은 OOP의 두 가지 ‘유형’이 아닙니다 ….)


답변

객체 지향 프로그래밍은 프로그래밍 언어를 구조화하여 낮은 결합, 정보 숨기기 (일명 캡슐화), 해당 데이터에서 함께 작동하는 번들링 데이터 및 메소드, 코드 재사용을 촉진하는 방법에 대한 아이디어입니다. 많은 언어들이 이러한 아이디어를 받아 들여서 객체 지향에 접근하는 방식에 대해 언어마다 차이가 있습니다. 예를 들어, Java는 한 클래스 만 1 개의 클래스를 확장 할 수 있습니다. 그러나 Python과 C ++를 사용하면 여러 클래스를 확장 할 수 있습니다. Java에는 한계가있는 구체적인 이유가 있습니다. C ++에서 문제를 해결하기위한 제한 사항이지만 Smalltalk는 단일 기본 클래스 만 지원하기 때문입니다.

OO 언어는 두 가족으로 그룹화 할 수 있습니다. 언어의 스몰 토크 패밀리 (또는 클래스 기반 OOP)에는 C ++, Java, 스몰 토크, 루비, C #, 파이썬이 포함됩니다 (이 제품군에는 톤이 있습니다). 이들은 정적 및 동적 유형 언어가 혼합되어 있으며 일부 개념에서는 약간 다르지만 OOP에 대한 생각은 매우 유사합니다. 이것이 의미하는 바는 커플 링, 캡슐화, 데이터 및 메소드 바인딩, 코드 재사용 및 사용자가 제공하는 도구에 접근하는 방식입니다. 이 가족 내에서 많은 개념이 동일합니다.

다른 가족은 protoype 기반 OOP입니다. 이러한 언어는 OOP 구현에서 매우 다르게 보입니다. 아마도 가장 잘 알려진 예는 Javascript이지만 Javascript는 Scheme 및 Object LISP에서 이러한 아이디어를 복사했습니다. 이들은 덜 알려진 언어이며 일반적으로 동적으로 유형이 지정됩니다. 정적으로 유형이 지정된 프로토 타입 기반 언어는 생각할 수 없지만 언어가없는 것은 아닙니다. http://en.wikipedia.org/wiki/Prototype-based_programming 에서 읽을 수 있습니다 . 요점은 클래스 기반 언어와는 매우 다른 방식으로 OOP에 접근한다는 것입니다. 즉,이 두 제품군간에 개념을 이식 할 수 없다는 의미입니다. 한 가정에서 OO를 알고 있다고해서 그러한 아이디어를 다른 가정으로 쉽게 전환 할 수는 없습니다.

대부분의 프로그래밍 언어는 많은 아이디어의 개념을 혼합합니다. 파이썬과 루비는 OOP와 기능적 프로그래밍 아이디어를 그들의 언어로 통합합니다. 또한 프로토 타입 기반 OO와 클래스 기반 언어의 특정 확장을 혼합하여 훨씬 더 복잡 할 수 있습니다.


답변

OOP는 프로그래밍의 원칙입니다. 기본적으로 아이디어입니다. OOP의 구현은 프로그래밍 언어에 따라 다르지만 OOP의 기둥 (추상, 상속, 캡슐화 및 다형성)은 일반적으로 어떤 방식이나 형태로 존재합니다.

자바는 파이썬보다 시맨틱 스를 프로그래머에게 조금 더 어렵게 만든다.

예를 들어

자바 코드 : class Cat extends Animal {}

OOP 관점에서 수행하는 작업에 대해 다음보다 조금 더 명확합니다.

파이썬 코드 : class Cat(Animal):

물론 둘 다 Cat이 Animal에서 상속하는 클래스 계층 구조를 정의합니다. 그러나 OOP에서 시작한 프로그래머에게는 OOP 아이디어의 응용 프로그램과 의미가 프로그래머에게 철자하기 때문에 Java에서 조금 더 나아질 수 있다고 생각합니다.


답변

OOP 개념을 배우는 가장 쉬운 언어가 무엇인지 명시 적으로 묻고 있습니다. 나는 대답이 분명하다고 생각합니다 : python .

이것이 왜 그런지 보여주기 위해 Java와 Python의 일반적인 초보자 프로그램을 살펴 보겠습니다. 간단하고 더 낮은 추측 게임을 만들어 봅시다.

자바

Java에서는 Game 클래스를 작성합니다.

public class Game {
    public int secretNumber;
    public int tries;

    public Game(int tries, int secretNumber) {
        this.tries = tries;
        this.secretNumber = secretNumber;
    }

    public void guess(int myNumber) {
        if(myNumber > secretNumber)
            System.out.println("Your guess is too high!");
        else if (myNumber < secretNumber)
            System.out.println("Your guess is too low!");
        else
            System.out.println("You win!!");
        tries = tries - 1;
        if(tries == 0) {
            System.out.println("No more tries: you lose :(");
        }
    }

    public static void main(String[] args) {
        Game game = new Game(10, 47);
        while(true) {
            // how do I read a newline again? Something with BufferedInputStreamReader?
            // how do I convert a String to a number?
        }
    }
}

저는 숙련 된 프로그래머이며 어려움을 겪고 있습니다. 또한이 간단한 프로그램을 위해 예비 학생에게 설명 할 내용을 살펴보십시오.

  • 정적 메소드
  • 공개 (비공개) 항상 필드를 비공개로 표시해야합니다.
  • this. 변수가 다른 사람에 의해 가려 질 때 변수를 나타내는 표기법
  • 생성자는 메서드와 비슷하지만 메서드가 아닙니다.
  • System.outoutputStream입니다. 그리고 예, 그것은 필드이지만 static필드입니다.
  • 하나의 문장 만 있으면 중괄호를 생략 할 수 있습니다.
  • String[]배열입니다. 그것은 특별한 유형의 객체이지만 다시는 실제로는 아닙니다.
  • int기본 유형입니다. 특별하다.
  • 많은 프레임 워크 방법이 필요합니다

파이썬

파이썬은 많은 ‘순수하다’. 기본 유형이 없습니다. 생성자가 존재하지 않으며 초기화시 호출되는 특수 메소드 만 있습니다.

가있는 것처럼 콘솔과 상호 작용할 필요가 없습니다 REPL. 당신은 단순히 g.guess(35)문자열을 사용 하고 반환하는 게임을 할 수 있습니다 .

이를 통해 언어를보다 쉽게 ​​배우고 기본 OOP 개념을 파악할 수 있습니다.